1

我在 UDP (WinSocks/C++) 中有简单的服务器和客户端。

我通过 sendto 发送数据报客户端 - > 服务器,并使用从 recvfrom 函数获得的 ip 和端口从服务器回复客户端。

我发现:

  1. 来自客户端的每个 sendto 都从不同的端口发送
  2. 当尝试从服务器回复时,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());
    }
}
4

1 回答 1

4

调用“绑定”函数来指定要发送的本地端口。下面是使用端口 4567 的示例。确保检查 bind 的返回值。创建套接字后调用此代码。

sockaddr_in local = {};
local.family = AF_INET;
local.port = htons(4567);
local.addr = INADDR_ANY;

bind(internal->sock,(sockaddr*)&local, sizeof(local));

如果您绑定到端口 0 而不是 4567,那么操作系统将为您选择一个随机端口并将其用于所有后续发送和接收。您可以调用getsockname 来发现调用bind 后操作系统为您选择的端口。

于 2011-12-15T22:39:58.100 回答