C语言使用UDP实现全双工聊天
时间: 2023-06-11 20:07:42 浏览: 186
UDP是无连接的传输协议,无法保证可靠性和顺序性,但是它可以实现快速的数据传输。在UDP中,聊天双方都是平等的,可以同时发送和接收消息,因此可以实现全双工聊天。
下面是一个简单的C语言程序,使用UDP协议实现全双工聊天。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8888
#define MAXSIZE 1024
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in servaddr, cliaddr;
socklen_t len;
char sendbuf[MAXSIZE], recvbuf[MAXSIZE];
pid_t pid;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
len = sizeof(cliaddr);
pid = fork(); //创建子进程
if (pid == 0) //子进程用于发送数据
{
while (fgets(sendbuf, MAXSIZE, stdin) != NULL)
{
sendto(sockfd, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&cliaddr, len);
}
}
else //父进程用于接收数据
{
while (1)
{
recvfrom(sockfd, recvbuf, MAXSIZE, 0, (struct sockaddr *)&cliaddr, &len);
printf("Received: %s", recvbuf);
memset(recvbuf, 0, MAXSIZE);
}
}
close(sockfd);
return 0;
}
```
在程序中,首先创建一个UDP套接字,然后绑定到指定的端口上。接着,创建一个子进程用于发送数据,父进程用于接收数据。子进程从标准输入中读取数据,然后通过套接字发送给对方。父进程从套接字中接收数据,并输出到标准输出上。
需要注意的是,程序中并没有指定对方的IP地址和端口号。在实际使用中,需要在程序中指定对方的IP地址和端口号,或者通过其他方式获取。
阅读全文