关于AF_INET,gcc 和 mingw问题

本文介绍如何将基于Linux的网络编程代码移植到Windows平台。重点讨论了AF_INET常量及getaddrinfo和getnameinfo函数在不同操作系统中的实现差异。对于跨平台开发人员来说,了解这些细节有助于更好地编写兼容多种操作系统的网络应用程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当把带有AF_INET的程序从linux移植到windows时候会发现,编译不过去,会提示AF_INET未定义,

那是因为在gcc中AF_INET定义在

这个头文件中,

在mingw已经没有这个头文件了,在mingw中AF_INET定义在

这个头文件中。,

一下就ok了

 

getaddrinfo getnameinfo这个两个函数在linux下包含在头文件netdb.h中,在windows中包含在ws2tcpip.h中。

Windows 上实现以下代码跟功能 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8080 #define BUFFER_SIZE 1024 int main() { int serverSocket, clientSocket; struct sockaddr_in serverAddr, clientAddr; socklen_t clientAddrLen; char buffer[BUFFER_SIZE]; // 创建服务端套接字 serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == -1) { perror("Failed to create socket"); exit(EXIT_FAILURE); } // 设置服务器地址信息 memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(SERVER_PORT); serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); // 绑定套接字到指定地址端口 if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) { perror("Failed to bind socket"); exit(EXIT_FAILURE); } // 监听连接请求 if (listen(serverSocket, 5) == -1) { perror("Failed to listen"); exit(EXIT_FAILURE); } printf("Server listening on port %d...\n", SERVER_PORT); // 接受客户端连接 clientAddrLen = sizeof(clientAddr); clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &clientAddrLen); if (clientSocket == -1) { perror("Failed to accept client connection"); exit(EXIT_FAILURE); } printf("Client connected: %s\n", inet_ntoa(clientAddr.sin_addr)); // 接收数据 memset(buffer, 0, sizeof(buffer)); if (recv(clientSocket, buffer, BUFFER_SIZE, 0) == -1) { perror("Failed to receive data"); exit(EXIT_FAILURE); } printf("Client message: %s\n", buffer); // 发送响应 strcpy(buffer, "Hello, Client!"); if (send(clientSocket, buffer, strlen(buffer), 0) == -1) { perror("Failed to send data"); exit(EXIT_FAILURE); } // 关闭套接字 close(clientSocket); close(serverSocket); return 0; } #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8080 #define BUFFER_SIZE 1024 int main() { int clientSocket; struct sockaddr_in serverAddr; char buffer[BUFFER_SIZE]; // 创建客户端套接字 clientSocket = socket(AF_INET, SOCK_STREAM, 0); if (clientSocket == -1) { perror("Failed to create socket"); exit(EXIT_FAILURE); } // 设置服务器地址信息 memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(SERVER_PORT); if (inet_pton(AF_INET, SERVER_IP, &(serverAddr.sin_addr)) <= 0) { perror("Failed to set server IP"); exit(EXIT_FAILURE); } // 连接到服务器 if (connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) { perror("Failed to connect to server"); exit(EXIT_FAILURE); } printf("Connected to server %s:%d\n", SERVER_IP, SERVER_PORT); // 发送数据 strcpy(buffer, "Hello, Server!"); if (send(clientSocket, buffer, strlen(buffer), 0) == -1) { perror("Failed to send data"); exit(EXIT_FAILURE); } // 接收响应 memset(buffer, 0, sizeof(buffer)); if (recv(clientSocket, buffer, BUFFER_SIZE, 0) == -1) { perror("Failed to receive data"); exit(EXIT_FAILURE); } printf("Server response: %s\n", buffer); // 关闭套接字 close(clientSocket); return 0; }
最新发布
07-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值