socket在Windows上面创建失败/c语言


#include <stdio.h>
#include <winsock2.h>
#include <sys/types.h>
#include <stdlib.h>


int main() {

    //使用socket函数创建套接字
    //创建一个用于UDP网络编程的套接字
    int sockfd;//创建来接收socket的返回值
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("Socket调用失败");
        exit(1);//退出程序
    }

    printf("sockfd = %d\n", sockfd);

    return 0;
}

结果

img

Linux不同,Windows上使用socket稍微麻烦点,需要先进行初始化。并且socket的返回值是SOCKET,而不是int。出错之后也并不会设置errno,因此perror会输出No error。要想知道出了什么错,要调用WSAGetLastError函数获得错误代码,并在Microsoft Docs上查阅对应代码的含义。
以下代码能够成功运行:

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

int main()
{
    // 初始化Winsock库
    WSADATA wsadata;
    if(WSAStartup(MAKEWORD(2, 2), &wsadata))
    {
        puts("WSAStartup failed.");
        return 1;
    }
    // 创建socket
    SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
    if(sock == INVALID_SOCKET)
    {
        puts("Socket creation failed.");
        return 1;
    }
    printf("sockfd = %u\n", sock);
    // 关闭socket,回收内存
    closesocket(sock);
    WSACleanup();
    return 0;
}