利用#include <sys/types.h> #include <winsock2.h> #include <winsock.h>来编写基于TCP和UDP的简单Client/Server网络应用程序 利用c语言
时间: 2024-09-18 08:15:59 浏览: 30
要使用`<sys/types.h>`、`<winsock2.h>`和`<winsock.h>`来编写基于TCP和UDP的简单C语言网络应用程序,首先确保已安装Windows Socket库。这些头文件通常与Windows开发环境一起提供。
以下是一个基本的示例,展示了如何创建一个简单的TCP服务器和客户端:
### TCP Server 示例[^1]:
```c
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
// 声明套接字类型
SOCKET server_socket;
int main() {
// 初始化 Winsock
WSADATA wsa_data;
if (WSAStartup(MAKEWORD(2, 2), &wsa_data) != 0) {
printf("Error initializing Winsock\n");
return 1;
}
// 创建服务器套接字
server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server_socket == INVALID_SOCKET) {
WSACleanup();
printf("Failed to create server socket\n");
return 1;
}
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SOME_PORT); // 替换为实际端口
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) != 0) {
closesocket(server_socket);
WSACleanup();
printf("Failed to bind server socket\n");
return 1;
}
listen(server_socket, SOMAXCONN); // 设置最大连接数
while (true) {
struct sockaddr_in client_addr;
socklen_t addr_len = sizeof(client_addr);
SOCKET client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addr_len);
if (client_socket == INVALID_SOCKET) {
break;
}
char message[] = "Hello from server!";
send(client_socket, message, strlen(message), 0);
recv(client_socket, buffer, 1024, 0); // 收取客户端消息
printf("Received: %s\n", buffer);
closesocket(client_socket);
}
closesocket(server_socket);
WSACleanup();
return 0;
}
```
### UDP Client 示例:
```c
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
SOCKET client_socket;
int main() {
WSADATA wsa_data;
if (WSAStartup(MAKEWORD(2, 2), &wsa_data) != 0) {
printf("Error initializing Winsock\n");
return 1;
}
client_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (client_socket == INVALID_SOCKET) {
WSACleanup();
printf("Failed to create client socket\n");
return 1;
}
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SOME_PORT); // 替换为实际端口
inet_pton(AF_INET, "SERVER_IP_ADDRESS", &server_addr.sin_addr); // 替换为服务器IP地址
char message[] = "Hello from client!";
DWORD bytes_sent = sendto(client_socket, message, strlen(message), 0,
(struct sockaddr *)&server_addr, sizeof(server_addr));
if (bytes_sent == SOCKET_ERROR) {
WSACleanup();
printf("Failed to send data\n");
return 1;
}
printf("Message sent successfully.\n");
char buffer[1024];
DWORD bytes_received = recvfrom(client_socket, buffer, sizeof(buffer), 0,
NULL, NULL);
if (bytes_received > 0) {
printf("Received: %s\n", buffer);
} else {
printf("No response received\n");
}
closesocket(client_socket);
WSACleanup();
return 0;
}
```
请注意,上述代码仅为示例,实际使用时需替换`SOME_PORT`和`SERVER_IP_ADDRESS`为实际的端口号和服务器IP地址。另外,对于Windows平台,可能需要链接额外的库文件以支持网络编程。