【发布时间】:2011-11-14 04:30:08
【问题描述】:
我在 C++ 中使用与挂钩客户端的 WSASend 和 WSARecv 函数相同的方法来挂钩 WSASend 和 WSARecv。在客户端中,我可以从 WSASend/WSARecv 传递的 SOCKET 结构中获取 IP、端口和套接字;但是,对于服务器,当我尝试使用 getpeername 或 getsockname() 时,它们都返回错误 10057 (Socket not connected)...
我相当确定服务器上的钩子是正确的,因为它成功打印了字节,而且我还确定套接字应该是有效的,看看客户端和服务器如何建立成功的连接。
有没有其他方法可以解决这个问题?我一直在互联网上寻找解决方案,但我没有看到任何人遇到同样的问题。
我试过了:
sockaddr *address = new sockaddr;
int peer_len;
getpeername(s, address, &peer_len);
int err = WSAGetLastError();
if(err==0)
{
char *Str = inet_ntoa(((sockaddr_in*)address)->sin_addr);
printf("[%s", Str);
printf(":%d]",ntohs(((sockaddr_in*)address)->sin_port));
}
else
{
printf("Error %i\n",err);
}
(同时使用getpeername和getsockname)两者都会导致相同的套接字未连接错误。
我计划使用 C++ dll 获取的数据包并将信息转发到 C# dll,因为这样会更容易管理(无论如何对我来说),但我需要区分每个数据包套接字 ID。
【问题讨论】:
-
我看到类似的行为,在我确定已连接的套接字上。我相信这是 Windows 中的一个错误(或至少在 Windows XP 中)。例如见bugzilla.mozilla.org/show_bug.cgi?id=513659
标签: c++