编写一个在VMware中可以使用的C语言的UDP通信程序,包括服务器和客户端代码,同事服务器端实现多线程通信
时间: 2024-03-20 11:44:55 浏览: 77
好的,这是一个可以在VMware中使用的C语言的UDP通信程序,包括服务器和客户端代码,同时服务器端支持多线程通信。
VMware中使用UDP通信时,需要在虚拟机的网络设置中将网络适配器设置为“桥接模式”,这样虚拟机就可以使用与主机相同的网络,从而实现与主机之间的通信。
首先是服务器端代码:
```c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<pthread.h>
#define SERVER_PORT 8888
#define MAX_BUFFER_SIZE 1024
void *thread_recv(void *arg)
{
int sockfd = *(int*)arg;
struct sockaddr_in client_addr;
socklen_t addr_len = sizeof(client_addr);
char buffer[MAX_BUFFER_SIZE];
while(1)
{
int n = recvfrom(sockfd, buffer, MAX_BUFFER_SIZE, 0, (struct sockaddr *)&client_addr, &addr_len);
if(n < 0)
{
perror("recvfrom error");
continue;
}
buffer[n] = '\0';
printf("[Server] receive message from %s:%d: %s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buffer);
}
close(sockfd);
}
int main()
{
// 创建 UDP socket
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
{
perror("create socket error");
exit(-1);
}
// 绑定监听地址
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
{
perror("bind error");
exit(-1);
}
// 创建多个线程接收数据
pthread_t thread_id[10];
for(int i=0; i<10; i++)
{
if(pthread_create(&thread_id[i], NULL, thread_recv, (void *)&sockfd) != 0)
{
perror("create thread error");
exit(-1);
}
}
// 等待线程结束
for(int i=0; i<10; i++)
{
pthread_join(thread_id[i], NULL);
}
return 0;
}
```
然后是客户端代码:
```c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#define SERVER_IP "192.168.1.100" // 虚拟机的IP地址
#define SERVER_PORT 8888
#define MAX_BUFFER_SIZE 1024
int main()
{
// 创建 UDP socket
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
{
perror("create socket error");
exit(-1);
}
// 设置服务器地址
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);
// 发送数据
char buffer[MAX_BUFFER_SIZE];
int n;
while(1)
{
printf("[Client] please input message: ");
fgets(buffer, MAX_BUFFER_SIZE, stdin);
buffer[strlen(buffer)-1] = '\0';
n = sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
if(n < 0)
{
perror("sendto error");
continue;
}
if(strcmp(buffer, "exit") == 0)
{
break;
}
}
close(sockfd);
return 0;
}
```
在客户端代码中,我们需要将服务器的 IP 地址设置为虚拟机的 IP 地址,这样客户端才能够与虚拟机中的服务器进行通信。
注意:由于 UDP 是不可靠的传输协议,因此在发送和接收数据时,需要对 `sendto` 和 `recvfrom` 函数返回值进行判断以确保数据传输的正确性。同时,由于 UDP 是无连接的,因此客户端发送数据时需要自己指定服务器的 IP 和端口号。
阅读全文