【问题标题】:c++ winsock server-client remote connection时间:2019-01-10 标签:c++winsock server-client远程连接
【发布时间】:2012-08-09 00:51:05
【问题描述】:

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

...

请提出解决问题的方法。谢谢

【问题讨论】:

  • 你为什么不尝试使用 boost.Asio。你会省去很多麻烦。
  • 不应该将sockConnect = socket (AF_INET, SOCK_STREAM, NULL);这一行初始化sockListen而不是sockClient吗?
  • sockListen 也在下面初始化。顺序无关紧要
  • @Caesar 我猜是因为他想使用winsock。仅仅因为有一个库可以做某事并不意味着你应该使用它。了解原生 API 会有很长的路要走。

标签: c++ winsock


【解决方案1】:

在调用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);
}

【讨论】:

    猜你喜欢
    • 2012-09-18
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多