大致代码如下:
SOCKET acsocket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP, 0, 0, WSA_FLAG_OVERLAPPED);
BYTE acbuff[2 * (sizeof(SOCKADDR_IN) + 16)];
AcceptEx(listener, acsocket, acbuff, 0, 16 + sizeof(SOCKADDR_IN), 16 + sizeof(SOCKADDR_IN), ...);
WSAWaitForMultipleEvents(...);
SOCKADDR *pLocalSockaddr, *pRemoteSockaddr;
INT LocalSockaddrLength, RemoteSockaddrLength;
GetAcceptExSockaddrs(acbuff, 0, 16 + sizeof(SOCKADDR_IN), 16 + sizeof(SOCKADDR_IN),
&pLocalSockaddr, &LocalSockaddrLength, &pRemoteSockaddr, &RemoteSockaddrLength);
//GetAcceptExSockaddrs调用成功,可以取得远程地址,但对acsocket调用getpeername就失败,
WSAGetLastError等于WSAENOTCONN,表面意思是连接未建立,其实不是,这个SOCKET既能接收数据,
又能发送数据,肯定是连接了的。这样有个问题就是,如果我需要在多个地方显示远程地址,
我还得把GetAcceptExSockaddrs获取的远程地址找个地方保存起来,而WSAAccept得到的SOCKET
就没这个问题,随时需要随时调用getpeername函数来获取即可,请问这是为什么,能否解决?
SOCKET acsocket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP, 0, 0, WSA_FLAG_OVERLAPPED);
BYTE acbuff[2 * (sizeof(SOCKADDR_IN) + 16)];
AcceptEx(listener, acsocket, acbuff, 0, 16 + sizeof(SOCKADDR_IN), 16 + sizeof(SOCKADDR_IN), ...);
WSAWaitForMultipleEvents(...);
SOCKADDR *pLocalSockaddr, *pRemoteSockaddr;
INT LocalSockaddrLength, RemoteSockaddrLength;
GetAcceptExSockaddrs(acbuff, 0, 16 + sizeof(SOCKADDR_IN), 16 + sizeof(SOCKADDR_IN),
&pLocalSockaddr, &LocalSockaddrLength, &pRemoteSockaddr, &RemoteSockaddrLength);
//GetAcceptExSockaddrs调用成功,可以取得远程地址,但对acsocket调用getpeername就失败,
WSAGetLastError等于WSAENOTCONN,表面意思是连接未建立,其实不是,这个SOCKET既能接收数据,
又能发送数据,肯定是连接了的。这样有个问题就是,如果我需要在多个地方显示远程地址,
我还得把GetAcceptExSockaddrs获取的远程地址找个地方保存起来,而WSAAccept得到的SOCKET
就没这个问题,随时需要随时调用getpeername函数来获取即可,请问这是为什么,能否解决?
解决方案 »
- vc网络远程控制软件,图像传到一定数量就停止不传了?
- 请教一本或者多本讲VC/MFC操作WORD的书籍,谢谢
- 极度匪夷所思的ListCtrl高度问题!
- 帮忙看下代码
- 求一VC的HTTP上传文件的例子,用wininet实现的
- BHO的问题:自己写的BHO组件对Maxthon封装的IE无效,WHY?
- 加在位图问题。
- 数据库范式问题
- 请教一个关于COM的问题,在COM中有一个叫moniker的术语,请问具体是什么意思,在注册表里面能否定位这个moniker?
- 关于VC6.0 Moaless对话框,急!!!
- D3D和OpenGL 在开发方面各自有什么优缺点
- [请举例] 只用fwrite将文本框提交的汉字写入文本文件
On Windows XP and later, once the AcceptEx function completes and the SO_UPDATE_ACCEPT_CONTEXT option is set on the accepted socket, the local address associated with the accepted socket can also be retrieved using the getsockname function. Likewise, the remote address associated with the accepted socket can be retrieved using the getpeername function.
就在
On Windows XP and later, once the AcceptEx function completes and the SO_UPDATE_ACCEPT_CONTEXT option is set on the accepted socket, the local address associated with the accepted socket can also be retrieved using the getsockname function. Likewise, the remote address associated with the accepted socket can be retrieved using the getpeername function. 这些语句的下面,有一段代码,你看到没有,加上这段代码就行了。这个我试过了。
err = setsockopt( sAcceptSocket,
SOL_SOCKET,
SO_UPDATE_ACCEPT_CONTEXT,
(char *)&sListenSocket,
sizeof(sListenSocket) );
我一直有用,但是似乎并没有效果,而我只能通过GetAcceptExSockaddrs取得相应的信息,并组存于连接上下文结构当中.(Windows 2000 Advance Server + SP4)