两个套接字无法相互连接 (C++)

Two sockets won't connect to one another (C++)

本文关键字:C++ 连接 套接字 两个      更新时间:2023-10-16

我正在使用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 WSAn", 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 socketn", WSAGetLastError());
        pause();
        return 1;
    }

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

    listen(uc_socket, 12);
    if (WSAGetLastError() != 0)
    {
        printf("Error %d while binding socketn", 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;
}

客户端.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 WSAn", 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 socketn", 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 socketn", 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,如代码中所述。

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

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() 的返回值和 SOCKET_ERRORconnect()(为 -1,而不是 0)等。 connect()可能失败了,并且您没有正确检测到错误,因此当它真正失败时,您认为它成功了。