c ++ winsock服务器 - 客户端远程连接

时间:2012-08-08 15:49:48

标签: c++ winsock

我正在尝试创建一个在两台远程计算机之间交换消息的简单应用程序。 使用“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);

...

请建议如何解决问题。 THX

1 个答案:

答案 0 :(得分:0)

在调用sockConnect之前,您不应该使用socket()初始化accept()变量。 accept()返回已经连接到客户端的 new 分配的套接字句柄。您正在泄漏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);
}