Linux UDP 单任务服务端和客户端实现
服务端
/* * main.c * 测试udp Socket套接字 单任务服务端代码实现 * Created on: 2020年3月4日 * Author: LuYonglei */ #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #define SERVER_PORT 9000 //服务器绑定的端口号 int main(int argc, char **argv) { //创建UDP套接字 int socket_fd = socket(AF_INET, SOCK_DGRAM, 0); //创建UDP套接字,使用IPV4协议 if (socket_fd < 0) { perror("socket_fd create failed"); exit(1); } //绑定端口号 struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; //ipv4 server_addr.sin_port = htons(SERVER_PORT); //设置端口号 server_addr.sin_addr.s_addr = INADDR_ANY; //通配地址 int ret = bind(socket_fd, (struct sockaddr*) (&server_addr), sizeof(struct sockaddr_in)); if (ret < 0) { perror("bind ip failed"); exit(1); } //接受客户端信息 struct sockaddr_in client_addr; //保存的客户端的ip协议和端口号信息 socklen_t client_addr_len; //长度 while (1) { char receive_buf[128] = ""; //接收缓冲区 recvfrom(socket_fd, receive_buf, sizeof(receive_buf), 0, (struct sockaddr*) (&client_addr), &client_addr_len); //接受客户端信息 printf("%s\n", receive_buf); //打印客户端的信息 sendto(socket_fd, receive_buf, strlen(receive_buf), 0, (struct sockaddr*) (&client_addr), client_addr_len); //把接受到的客户端信息再发送给客户端回显 } close(socket_fd); return 0; }
客户端
/* * main.c * 测试udp Socket套接字 客户端代码 * Created on: 2020年3月4日 * Author: LuYonglei */ #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #define SERVER_PORT 9000 //服务器端口号 const char *server_ip_addr = "127.0.0.1"; //服务器ip地址 /* * SOCK_STREAM 流式套接字,主要用于TCP * SOCK_DGRAM 报式套接字,主要用于UDP */ int main(int argc, char **argv) { //创建服务器信息结构体 struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; //设置为IPV4 server_addr.sin_port = htons(SERVER_PORT); //服务器端口号,转换为网络字节流 大端 inet_pton(AF_INET, server_ip_addr, &(server_addr.sin_addr.s_addr)); //设置服务器ip地址 //创建UDP套接字 int socket_fd = socket(AF_INET, SOCK_DGRAM, 0); if (socket_fd < 0) { perror("socket_fd create failed"); exit(1); } while (1) { char send_buf[128] = ""; //定义缓冲区 read(STDIN_FILENO, send_buf, sizeof(send_buf)); //从标准输入读取待发送信息到缓冲区 send_buf[strlen(send_buf) - 1] = 0; //此处使用来处理输入的换行符 sendto(socket_fd, send_buf, strlen(send_buf), 0, (struct sockaddr*) (&server_addr), sizeof(struct sockaddr_in)); char receive_buf[128] = ""; recvfrom(socket_fd, receive_buf, sizeof(receive_buf), 0, NULL, NULL); //从缓冲区读入信息到read_buf printf("%s\n", receive_buf); } close(socket_fd); return 0; }