【发布时间】:2012-01-21 13:56:39
【问题描述】:
我在 UDP (WinSocks/C++) 中有简单的服务器和客户端。
我通过sendto发送数据报客户端->服务器,并使用从recvfrom函数获得的ip和端口从服务器回复客户端。
我发现:
- 来自客户端的每个 sendto 都从不同的端口发送
- 当尝试从服务器回复时,Windows 返回 WSAECONNRESET(这意味着端口已关闭 - http://support.microsoft.com/kb/263823)
如何从服务器正确应答客户端(即使用 sendto 发送时强制客户端绑定端口?)
编辑:添加一些源代码:
bool InitClient()
{
internal->sock = socket(PF_INET, SOCK_DGRAM, 0);
char8 yes = 1;
setsockopt(internal->sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int32));
return internal->sock != -1;
}
void Send(const IpAddress & target, const uint16 port, const char8 * data, int32 size )
{
sockaddr_in trgt;
memset(&trgt, 0, sizeof(trgt));
trgt.sin_family = AF_INET;
trgt.sin_port = htons(port);
trgt.sin_addr.s_addr = target.GetRaw();
if(sendto(internal->sock, (const char8 *)data, size, 0, (PSOCKADDR)&trgt, sizeof(trgt)) == SOCKET_ERROR)
{
LOG("Network sending error: %d", WSAGetLastError());
}
}
【问题讨论】:
-
看看this answer有没有帮到你?
-
msdn.microsoft.com/en-us/library/windows/desktop/… cboard.cprogramming.com/networking-device-communication/…
-
如果有一个隐式的
bind调用,那么我希望每次新使用sendto都会重新使用以前的端口...