编写UDP程序,通过IO复用同时处理标准输入和套接字。当检测到终端有数据输入时读取文本发送给对端;当通过套接字收到对方消息时输出到终端上。
时间: 2023-05-21 08:01:53 浏览: 56
可以使用select函数来实现IO复用,以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define BUF_SIZE 1024
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s <IP> <port>\n", argv[0]);
return 1;
}
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
perror("socket");
return 1;
}
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
perror("connect");
return 1;
}
fd_set read_fds;
FD_ZERO(&read_fds);
FD_SET(STDIN_FILENO, &read_fds);
FD_SET(sock, &read_fds);
while (1) {
fd_set tmp_fds = read_fds;
if (select(sock + 1, &tmp_fds, NULL, NULL, NULL) == -1) {
perror("select");
break;
}
if (FD_ISSET(STDIN_FILENO, &tmp_fds)) {
char buf[BUF_SIZE];
if (fgets(buf, BUF_SIZE, stdin) == NULL) {
break;
}
buf[strlen(buf) - 1] = '\0'; // remove newline
if (send(sock, buf, strlen(buf), 0) == -1) {
perror("send");
break;
}
}
if (FD_ISSET(sock, &tmp_fds)) {
char buf[BUF_SIZE];
ssize_t n = recv(sock, buf, BUF_SIZE - 1, 0);
if (n == -1) {
perror("recv");
break;
} else if (n == 0) {
printf("Connection closed by server.\n");
break;
}
buf[n] = '\0';
printf("%s\n", buf);
}
}
close(sock);
return 0;
}
```
这个程序使用UDP协议与指定的IP地址和端口建立连接,然后使用select函数监听标准输入和套接字的可读事件。如果标准输入可读,就读取一行文本并发送给对端;如果套接字可读,就接收对方发送的消息并输出到终端上。注意,这个程序没有做任何错误处理和异常情况处理,仅供参考。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)