0

我正在尝试创建一个在两台远程计算机之间交换消息的简单应用程序。使用“127.0.0.1” ip 它可以正常工作,等待客户端的确认并连接到客户端,但是如果我尝试使用相同端口的本地“192.168.0.15”或我的全局 ip,服务器会立即连接到某事而没有等待客户。

这是我的服务器代码的一部分:

char ip[20] = "127.0.0.1"; int port = 19385;

SOCKET sockListen, sockConnect;

SOCKADDR_IN address;

sockConnect = socket (AF_INET, SOCK_STREAM, NULL);
address.sin_addr.s_addr = inet_addr (ip);
address.sin_family = AF_INET;
address.sin_port = htons (port); 
sockListen = socket (AF_INET, SOCK_STREAM, NULL);

bind (sockListen, (SOCKADDR*)&address, AddressSize);
listen (sockListen, SOMAXCONN);

sockConnect = accept (sockListen, (SOCKADDR*)&address, &AddressSize);

...

请建议如何解决问题。谢谢

4

1 回答 1

0

您不应该在调用之前初始化sockConnect变量。 返回已连接到客户端的新分配的套接字句柄。您正在泄漏分配的套接字句柄。socket()accept()accept()socket()

您只能bind()访问属于运行应用程序的本地计算机的 NIC 的 IP。您不能bind()访问外部 IP。

您显示的代码根本没有进行任何错误处理。您需要添加它,例如:

int errCode;

SOCKET sockListen = socket (AF_INET, SOCK_STREAM, NULL); 
if (sockListen == INVALID_SOCKET)
{
    errCode = WSAGetLastError();
    // ...
}
else
{ 
    SOCKADDR_IN address = {0}; 
    address.sin_addr.s_addr = inet_addr (ip); 
    address.sin_family = AF_INET; 
    address.sin_port = htons (port);  

    if (bind (sockListen, (SOCKADDR*)&address, sizeof(address)) == SOCKET_ERROR)
    {
        errCode = WSAGetLastError();
        // ...
    }
    else
    {
        if (listen (sockListen, SOMAXCONN) == SOCKET_ERROR)
        {
            errCode = WSAGetLastError();
            // ...
        }
        else
        {
            int addressSize; 

            SOCKET sockClient = accept (sockListen, (SOCKADDR*)&address, &addressSize); 
            if (sockClient == INVALID_SOCKET)
            {
                errCode = WSAGetLastError();
                // ...
            }
            else
            {
                // ...
                closesocket(sockClient);
            }
        }
    }

    closesocket(sockListen);
}
于 2012-08-08T16:51:05.567 回答