簡體   English   中英

c++ TCP 客戶端和服務器無法在本地計算機上通信

[英]c++ TCP client and server not able to communicate on local machine

我使用winsock構建了一個簡單的c++ TCP服務器和客戶端。 代碼全部編譯沒有錯誤,但是服務器拒絕連接或我的客戶端無法正確連接。

代碼很多放在stackoverflow上,所以這里是服務器和客戶端的pastebin。

https://pastebin.com/ZQavPxsR - 服務器代碼

https://pastebin.com/cLFVp2B1 - 客戶端代碼

    sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    InetPton(AF_INET, _T("127.0.0.1"), &clientService.sin_addr.s_addr);
    clientService.sin_port = htons(port);
 
    if (connect(clientSocket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
    {
        std::cout << "Client: connect() = Failed to connect." << std::endl;
        WSACleanup();
        system("pause");
        return 0;
    }
    else
    {
        std::cout << "Client: connect() is OK." << std::endl;
        std::cout << "Client: Can start sending and reciving data... " << std::endl;
    }

上面是來自客戶端的代碼片段,負責與服務器建立連接。

    acceptSocket = accept(serverSocket, NULL, NULL);

    if (acceptSocket == INVALID_SOCKET)
    {
        std::cout << "Accept Failed: " << WSAGetLastError() << std::endl;
        WSACleanup();
        return -1;
    }
    else
    {
        std::cout << "Accepted connection " << std::endl;
        system("pause");
        WSACleanup();
    }

上面是來自服務器的代碼片段,負責接受與客戶端的連接。

您的服務器在調用bind()之前沒有初始化service.sin_port字段,因此代碼表現出未定義的行為 您的偵聽套接字最終將嘗試綁定到sin_port字段占用的 memory 中已經存在的任何隨機端口值。 如果該值恰好是0 ,則bind()將從 Windows 的可用臨時端口中選擇一個隨機端口。 在任何情況下,您的服務器都不太可能監聽端口4679 ,這是客戶端嘗試連接的端口。


附帶說明一下,您的代碼還有其他一些問題:

  • 在客戶端和服務器中,您對InetPton()的調用應該傳遞一個指向sockaddr_in::sin_addr字段的指針,而不是sockaddr_in::sin_addr.s_addr字段。 它“有效”只是因為s_addrsin_addr的唯一數據成員,因此它們具有相同的 memory 地址。 但從技術上講,這是未定義的行為,因為InetPton()想要一個IN_ADDR*而不是ULONG*

  • 如果listen()失敗,您的服務器不會退出,無論accept()成功還是失敗都會泄漏serverSocket ,如果accept()成功則泄漏acceptSocket

  • 無論connect()成功還是失敗,您的客戶端都在泄漏clientSocket

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM