使用Dev C++进行Windows socket网络编程,需链接lws2_32库

背景

在我们使用Dev C++进行C语言编程时,如果我们引入的库是C语言标准库,那我们是不要在编译器选项中进行额外的设置的,但是如果我们使用的是一些不是C语言标准库,那我们可能就需要在编译器选择中进行设置。

使用Dev C++进行Windows socket网络编程时,我们需要额外导入。

Windows 下的 socket 程序和 Linux 思路相同,但细节有所差别:

  1. Windows 下的 socket 程序依赖 Winsock.dll 或 ws2_32.dll,必须提前加载。

  2. Linux 使用“文件描述符”的概念,而 Windows 使用“文件句柄”的概念;Linux 不区分 socket 文件和普通文件,而 Windows 区分;Linux 下 socket() 函数的返回值为 int 类型,而 Windows 下为 SOCKET 类型,也就是句柄。

使用下面的代码进行测试:

#include 
#include 
#pragma comment(lib, "ws2_32.lib")  //加载 ws2_32.dll
#define BUF_SIZE 100
int main(){
    //初始化DLL
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    //创建套接字
    SOCKET sock = socket(PF_INET, SOCK_DGRAM, 0);
    //服务器地址信息
    struct sockaddr_in servAddr;
    memset(&servAddr, 0, sizeof(servAddr));  //每个字节都用0填充
    servAddr.sin_family = PF_INET;
    servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    servAddr.sin_port = htons(1234);
    //不断获取用户输入并发送给服务器,然后接受服务器数据
    struct sockaddr fromAddr;
    int addrLen = sizeof(fromAddr);
    while(1){
        char buffer[BUF_SIZE] = {0};
        printf("Input a string: ");
        gets(buffer);
        sendto(sock, buffer, strlen(buffer), 0, (struct sockaddr*)&servAddr, sizeof(servAddr));
        int strLen = recvfrom(sock, buffer, BUF_SIZE, 0, &fromAddr, &addrLen);
        buffer[strLen] = 0;
        printf("Message form server: %s\n", buffer);
    }
    closesocket(sock);
    WSACleanup();
    return 0;
}

如果不进行编译器设置,则会报错,报错提示如下所示:

使用Dev C++进行Windows socket网络编程,需链接lws2_32库_第1张图片

我们需要做如下设置:

在工具-编译器选项中,在连接器命令中加入一下命令:-lws2_32

使用Dev C++进行Windows socket网络编程,需链接lws2_32库_第2张图片

使用Dev C++进行Windows socket网络编程,需链接lws2_32库_第3张图片

点击确定后,编译运行,显示可以正常编译运行。

使用Dev C++进行Windows socket网络编程,需链接lws2_32库_第4张图片

你可能感兴趣的:(C语言,c语言)