sockaddr_in * sa_server = NULL;
sa_server = new sockaddr_in;
memset( sa_server , 0, sizeof(sockaddr_in) );
int sa_server_len = sizeof(sockaddr_in);
sockaddr_in * sa_client = NULL;
sa_client = new sockaddr_in;
memset( sa_client , 0, sizeof(sockaddr_in) );
int sa_client_len = sizeof(sockaddr_in);GetAcceptExSockaddrs( pNode->wsaBuffer.buf, //acceptex中设定的值
1500 - (sizeof(SOCKADDR_IN) + 16) * 2,//同上
sizeof(SOCKADDR_IN) + 16, //同上
sizeof(SOCKADDR_IN) + 16, //同上
(sockaddr **) &sa_server,
&sa_server_len,
(sockaddr **) &sa_client,
&sa_client_len);CString strTemp;
strTemp = inet_ntoa(sa_client->sin_addr);郁闷了很久了.
大家帮帮忙,好象没什么错啊!
谢谢!
sa_server = new sockaddr_in;
memset( sa_server , 0, sizeof(sockaddr_in) );
int sa_server_len = sizeof(sockaddr_in);
sockaddr_in * sa_client = NULL;
sa_client = new sockaddr_in;
memset( sa_client , 0, sizeof(sockaddr_in) );
int sa_client_len = sizeof(sockaddr_in);GetAcceptExSockaddrs( pNode->wsaBuffer.buf, //acceptex中设定的值
1500 - (sizeof(SOCKADDR_IN) + 16) * 2,//同上
sizeof(SOCKADDR_IN) + 16, //同上
sizeof(SOCKADDR_IN) + 16, //同上
(sockaddr **) &sa_server,
&sa_server_len,
(sockaddr **) &sa_client,
&sa_client_len);CString strTemp;
strTemp = inet_ntoa(sa_client->sin_addr);郁闷了很久了.
大家帮帮忙,好象没什么错啊!
谢谢!
解决方案 »
- 关于使用DirectShow发送视频数据的问题
- VS2005如何设置Tab的空格数?
- 客户端程序如何分别通过电脑上两张同网段网卡分别连到不同的服务器?
- 如何让控件显示窗体的背景色,而非本身的颜色
- Error spawning 'vcspawn.exe'
- CSDN的分越来越难挣了,大家抓住机会哦。多线程的利用虚函数同步机制遇到的问题.
- unresolved external symbol __mbctype
- MSN里输入对话内容的是不是个编辑框啊?怎么在spy++中找不到?
- About ddk!
- 对邮件的处理
- 如何利用ftp作中继,连接局域网和Internet?
- 如何用一个位图作为一个对话框的背景
BOOL IOCOMP_ParseAddr(LPIO_CONTEXT lpIoContext)
/*++Function Description: 此函数在IOCOMP_HandleAccept里调用,获取刚连接上来的客户端的IP和端口,
并保存在lpCommonObject的相应成员变量里,并判断本地端口是否是80
如果是80,返回TRUE,否则返回FALSE。Arguments:Return Value: 如果本地端口是80,返回TRUE,否则返回FALSE。--*/
{
int nLen = 0;
LPSOCKADDR RemoteAddr;
LPSOCKADDR LocalAddr;
SOCKADDR_IN SockAddr;
nLen = sizeof(SOCKADDR);
lpGetAcceptExSockAddrs(
lpIoContext->szBuffer,
0,
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
&LocalAddr,
&nLen,
&RemoteAddr,
&nLen
);
memcpy(&SockAddr, RemoteAddr, sizeof(struct sockaddr));
strncpy(lpIoContext->lpCommonObject->chClientAddr, inet_ntoa(SockAddr.sin_addr),15);
lpIoContext->lpCommonObject->nClientPort = ntohs(SockAddr.sin_port);
//
// 获取本地端口并判断是否是80
// ZeroMemory(&SockAddr, sizeof(SOCKADDR_IN));
memcpy(&SockAddr, LocalAddr, sizeof(struct sockaddr));
if (ntohs(SockAddr.sin_port) == 80)
{
return TRUE;
} return FALSE;
}// end of IOCOMP_ParseAddr
我添加了RemoteAddr = new sockaddr;
可以运行,但还是不能得到IP啊.晕了.
g_sListen[nIndex],
lpAcceptIoContext->sClient,
lpAcceptIoContext->wsaBuffer.buf,
0,
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
&dwBytes,
&lpAcceptIoContext->ol
);反正这个代码在我的程序里运行得非常正常/
BOOL bSuccess = lpAcceptEx(m_ListenSocket,
lpAcceptIoContext->sAimClient,
lpAcceptIoContext->szBuffer,
BUFFER_SIZE - (sizeof(SOCKADDR_IN) + 16) * 2,
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
&dwBytes,
&(lpAcceptIoContext->OverLapped));
我猜想应该是这两个指针的问题吧.
LPSOCKADDR RemoteAddr;
LPSOCKADDR LocalAddr;
这两个只是申明了指针,但没有分配内存给它.
对不起啊!
你的代码没错.
我先前直接调用GetAcceptExSockaddrs这个函数的,不知道为什么就不行.
后来没使用mswsock.lib,而使用WSAIoctl函数取得指针后再调用就没问题了.呵呵,想不通为什么会这样.是不是我前面AcceptEx是使用WSAIoctl函数取得的函数指针,后面的GetAcceptExSockaddrs也必须这样做呢?