簡體   English   中英

套接字無法綁定(C與WinSock)

[英]Socket fails to bind (C with WinSock)

這應該將套接字綁定到本地主機上的端口並接受TCP連接。 當我運行它時,我收到“綁定錯誤”消息。 我使用了教程(請參閱“接受連接”部分),我和我的代碼之間唯一的顯着區別是服務器地址和端口成員初始化的位置,只要它們出現就沒關系在bind()調用之前?

我在Windows防火牆(在Windows 7中)中添加了一條新規則,以允許該可執行文件的8888端口進行TCP連接,但這似乎無濟於事。

#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

int main(int argc, char *argv[])
{
    WSADATA wsa;
    SOCKET s, new_socket;
    struct sockaddr_in server, client;
    int c;

    printf("\nInitializing WinSock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
    printf("Failed. Error code: %d\n\n", WSAGetLastError());
    exit(1);
    }

    printf("\nInitialized.");

    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(8888);
    server.sin_family = AF_INET;


    if (s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) == INVALID_SOCKET)
    {
    printf("\nCould not create socket: %d", WSAGetLastError());
    exit(1);
    }
    printf("\nSocket created.\n");

    if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
    {
    printf("\nBind error.\n\n");
    exit(1);
    }
    printf("\nSocket bound to port 8888.\n\n");
    listen(s, 3);

    printf("\nWaiting for incoming connections...");

    c = sizeof(struct sockaddr_in);
    new_socket = accept(s, (struct sockaddr *)&client, &c);
    if (new_socket == INVALID_SOCKET)
    {
    printf("\nAccept failed.\n\n");
    exit(1);
    }
    printf("\nConnection accepted.");


    closesocket(s);
    WSACleanup();

    return 0;
}

這個說法:

if (s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) == INVALID_SOCKET)

在作業周圍需要附加一組括號:

if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)

==運算符的優先級比=運算符的優先級高(請參閱Operator Operator Precedence ),因此原始語句隱式地表現為好像您是這樣編寫的:

if (s = (socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) == INVALID_SOCKET))

如果socket()成功,則比較結果為false ,然后將s分配0 (因為SOCKET只是UINT_PTR的別名, UINT_PTR將布爾值分配給SOCKET變量),然后bind()將失敗,並且WSAENOTSOCK錯誤(如果socket()失敗,則比較結果為true ,這將為s分配1 ,則if結果為true,並且您的進程將退出)。

我個人不喜歡在同一條語句中進行賦值和比較的代碼。 這樣會更清楚更安全:

s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)

此外,別忘了在accept()成功之后在new_socket上調用closesocket()

暫無
暫無

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

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