两个套接字不会相互连接 (C++)

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

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

server.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;
}

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

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

此外,这些陈述在客户端是错误的:

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() 的 return 值和 INVALID_SOCKETaccept()bind()listen() 的 return 值,以及connect() for SOCKET_ERROR(-1,不是 0)等。 connect() 可能会失败,而您没有正确检测到错误,所以当它真的失败时您认为它成功了。