C++ Winsock 服务器-客户端远程连接

c++ winsock server-client remote connection

本文关键字:客户端 远程连接 服务器 Winsock C++      更新时间:2023-10-16

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

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

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);

请建议如何解决问题。

在调用 accept() 之前,您不应该使用 socket() 初始化 sockConnect 变量。 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);
}