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;
} 相关推荐
iamplane 2020-04-20
digwtx 2020-09-14
efeve 2020-09-14
poplpsure 2020-08-17
ITxiaobaibai 2020-07-26
libowenhit 2020-07-23
luckykapok 2020-07-06
hongsheyoumo 2020-06-27
jannal 2020-06-21
lanmantech 2020-06-16
咻咻ing 2020-06-16
weibingbingnet 2020-06-14
woyanyouxin 2020-06-04
houjinkai 2020-06-03
txj 2020-06-02