无法绑定 winsock 套接字

Can't bind winsock socket

我对 C++ 网络很陌生,所以我一直在看一些教程,但我似乎无法找出为什么我不能绑定我的套接字。有人可以向我解释我做错了什么吗?这是我绑定套接字的代码。

#include <stdlib.h>
#include <winsock2.h>

#pragma comment (lib,"ws2_32.lib")
#pragma warning( disable : 4996)
#define PORT 17027
int main()
{
    //creating socket
    SOCKET listenSocket = INVALID_SOCKET;
    listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    //bind socket
    struct sockaddr_in address;
    memset(&address, 0, sizeof(address));
    address.sin_family = AF_INET;
    address.sin_port = htons(PORT);

    int bindValue = bind(listenSocket, (struct sockaddr *)&address, sizeof(address));
    if (bindValue == SOCKET_ERROR) {
        std::cout << WSAGetLastError() << std::endl; 
        return 1;
    }

输出:无法绑定:10038

您必须说明要将套接字绑定到哪个接口。这是通过设置 sockaddr_in 结构的 sin_addr 成员来完成的。

例如,要绑定到通配符接口 INADDR_ANY(以便能够接收来自所有接口的连接),您可以这样做:

address.sin_addr.s_addr = htonl(INADDR_ANY);

而要绑定到特定接口,您可以这样做:

address.sin_addr.s_addr = inet_addr("interface IP here");

关于错误报告,Winsock API 没有设置 errno 错误(errnoperror() 使用)。相反,您需要使用 WSAGetLastError() to get the error code, and FormatMessage() 来获取错误描述。

错误 10038WSAENOTSOCK(“非套接字上的套接字操作”),这意味着您正在对无效的 SOCKET 调用 bind()。事实上,您没有检查 socket() 是否成功。它不是,因为你没有先调用 WSAStartup(),所以 socket() 失败并出现 WSANOTINITIALISED 错误(“成功的 WSAStartup 尚未执行”)。

The WSAStartup function must be the first Windows Sockets function called by an application or DLL. It allows an application or DLL to specify the version of Windows Sockets required and retrieve details of the specific Windows Sockets implementation. The application or DLL can only issue further Windows Sockets functions after successfully calling WSAStartup.