【问题标题】:Two sockets won't connect to one another (C++)两个套接字不会相互连接(C++)
【发布时间】:2016-02-17 23:29:00
【问题描述】:

我正在使用 C++ 网络,并且几乎编写了我的第一个程序,由一个服务器和一个相互连接的客户端组成。这是我的代码-

服务器.cpp

#include "stdafx.h"

using namespace std;

int main()
{



    int wsasuccessful;
    WSAData WinSockData;
    WORD DLLVERSION;
    DLLVERSION = MAKEWORD(2, 1);
    wsasuccessful = WSAStartup(DLLVERSION, &WinSockData);
    if (wsasuccessful != 0)
    {
        printf("Error %d while starting WSA\n", wsasuccessful);
        pause();
        return 1;
    }



    SOCKADDR_IN ADDRESS;
    int AddressSize = sizeof(ADDRESS);
    SOCKET uc_socket;



    uc_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ADDRESS.sin_addr.s_addr = INADDR_ANY;
    ADDRESS.sin_family = AF_INET;
    ADDRESS.sin_port = htons(444);
    if (WSAGetLastError() != 0)
    {
        printf("Error %d while establishing socket\n", WSAGetLastError());
        pause();
        return 1;
    }



    bind(uc_socket, (SOCKADDR *)&ADDRESS, AddressSize);
    if (WSAGetLastError() != 0)
    {
        printf("Error %d while binding socket\n", WSAGetLastError());
        pause();
        return 1;
    }



    listen(uc_socket, 12);
    if (WSAGetLastError() != 0)
    {
        printf("Error %d while binding socket\n", WSAGetLastError());
        pause();
        return 1;
    }


    SOCKET c_socket;
    SOCKADDR client_sock;
    int client_sock_size = sizeof(client_sock);
    printf("Socket created; Set to listen for incoming connections");
    c_socket = accept(uc_socket, (SOCKADDR *)&client_sock, &client_sock_size);
    printf("Connection found!");



    pause();
    return 0;
}

client.cpp

#include "stdafx.h"

using namespace std;


int main()
{
    int wsasuccessful = -1;
    WSAData WinSockData;
    WORD DLLVERSION;
    DLLVERSION = MAKEWORD(2, 1);
    wsasuccessful = WSAStartup(DLLVERSION, &WinSockData);
    if (wsasuccessful != 0)
    {
        printf("Error %d in client while starting WSA\n", WSAGetLastError());
        pause();
        return 1;
    }



    SOCKET client_socket;
    client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (WSAGetLastError() != 0)
    {
        printf("Error %d in client while instantiating socket\n", WSAGetLastError());
        pause();
        return 1;
    }



    SOCKADDR_IN client_connection;
    client_connection.sin_family = AF_INET;
    client_connection.sin_port = (USHORT)(444);

    client_connection.sin_addr.S_un.S_addr = (unsigned long)("0.0.0.0");



    int connection_success = -1;
    printf("Connection started!");
    connection_success = connect(client_socket, (SOCKADDR *)&client_connection, sizeof(client_connection));
    if (connection_success != 0)
    {
        printf("Error %d in client while instantiating socket\n", WSAGetLastError());
        pause();
        return 2;
    }
    printf("The client has found a server!");
    printf("The last WSA error was: %d", WSAGetLastError());


    pause();
    return 0;
}
  • 多次检查后我没有看到任何错误,但在启动两者后我没有获得连接(当然是服务器优先)

  • 我已设置防火墙以允许连接到网络

  • 这两个二进制文件在侦听(当然)和连接时卡住了。分别是服务器和客户端。

  • 我检查了正在使用的端口和关联的 PID (netstat -a -o),果然,服务器正在侦听端口 444,如代码中所述。

有人对可能导致问题的原因有任何想法吗?

【问题讨论】:

  • client_connection.sin_addr.S_un.S_addr = (unsigned long)("0.0.0.0"); 将字符串转换为 unsigned long 没有意义。
  • 大卫是对的。您必须改用 inet_addr("0.0.0.0") 或等效项。
  • 如果前面的 Winsock 调用返回 -1,您应该只检查 WSAGetLastError()

标签: c++ sockets networking winsock


【解决方案1】:

0.0.0.0(又名INADDR_ANY)对于connect() 的客户端来说不是有效的IP 地址。如果服务器和客户端在同一台机器上运行,您可以改用127.0.0.1(又名INADDR_LOOPBACK),因为您的服务器绑定到INADDR_ANY,其中包括127.0.0.1

此外,这些语句在客户端是错误的:

client_connection.sin_port = (USHORT)(444);
client_connection.sin_addr.S_un.S_addr = (unsigned long)("0.0.0.0");

您需要使用inet_addr()(或等效的)将IP 地址从字符串格式转换为二进制格式。你需要改用htons(),就像你在服务器端做的那样:

client_connection.sin_port = htons(444);
client_connection.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

此外,您的错误处理通常是错误的。不要调用WSAGetLastError(),除非实际上首先报告了错误。这意味着检查socket()accept() 的返回值是否为INVALID_SOCKETbind()listen()connect() 的返回值是否为SOCKET_ERROR(为-1,而不是0)等.connect() 很可能失败了,你没有正确检测到错误,所以当它真的失败时你认为它成功了。

【讨论】:

  • 感谢您的回答!在修复错误报告时,我自然会发现更多错误,但我最好了解它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2011-02-10
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
相关资源
最近更新 更多