簡體   English   中英

“錯誤設置 TCP 套接字選項”錯誤與 setsockopt()

[英]"Error Setting TCP Socket Options" error with setsockopt()

此片段取自server.c ,它應該從客戶端計算機接收數據:

int main() {
    int sock, client_socket;
    char buffer[1024];
    char response[18384];
    struct sockaddr_in server_address, client_address;
    int i = 0;
    int optval = 1;
    socklen_t client_length;

    sock = socket(AF_INET, SOCK_STREAM, 0);

    if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *) &optval, sizeof(optval)) < 0) {
        printf("Error Setting TCP Socket Options!\n");
        return 1;
    }

    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = inet_addr("10.0.0.188");
    server_address.sin_port = htons(12345);

    bind(sock, (struct sockaddr *) &server_address, sizeof(server_address));
    listen(sock, 5);
    client_length = sizeof(client_address);
    client_socket = accept(sock, (struct sockaddr *) &client_address, &client_length);

When I compile and run this on Kali Linux, it sets the TCP socket fine and works, but when I compile and run this on Windows with gcc gcc server.c -o server.exe -lws2_32 , I get the error message from setsockopt() :

設置 TCP 插座選項時出錯!

此代碼段下方是bind()listen() function,以及決定如何處理從客戶端接收到的數據的if/else塊。

在 Windows 上,您必須在使用任何其他套接字函數之前調用WSAStartup() (並在退出之前使用 Winsock 庫時調用WSACleanup() )。 其他平台沒有類似的功能來初始化/清理他們的套接字庫。

而且,您應該始終檢查套接字函數(或任何系統調用)的返回值是否失敗,並使用WSAGetLastError() (在其他平台上為errno )來檢索錯誤代碼給 tel,了解函數失敗的原因

您沒有檢查socket()是否失敗(這將報告WSANOTINITIALISED錯誤),因此您將無效的套接字傳遞給setsockopt() (這將報告WSAENOTSOCK錯誤)。

嘗試這個:

int main() {
    WSADATA wsa;
    SOCKET sock, ...;
    ...
    BOOL optval = TRUE;
    ...

    int err = WSAStartup(MAKEWORD(2,0), &wsa);
    if (err != 0) {
        printf("Error Initializing WinSock! Error: %d\n", err);
        return 1;
    }

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == INVALID_SOCKET) {
        err = WSAGetLastError();
        printf("Error Creating TCP Socket! Error: %d\n", err);
        WSACleanup();
        return 1;
    }

    if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *) &optval, sizeof(optval)) < 0) {
        err = WSAGetLastError();
        printf("Error Setting TCP Socket Options! Error: %d\n", err);
        closesocket(sock);
        WSACleanup();
        return 1;
    }

    ...

暫無
暫無

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

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