依据尚硅谷Linux写的UDP通信代码,客户端向服务端发送数据,服务端接收并回复ok
一、UDP服务端
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#define handle_error(cmd, result) \
if (result < 0) \
{ \
perror(cmd); \
return -1; \
}
int main(int argc,const char*argv[])
{
struct sockaddr_in server_addr,client_addr;
int sockfd,temp_result;
char *buf=malloc(sizeof(char)*1024);
//清空结构体
memset(&server_addr,0,sizeof(server_addr));
memset(&client_addr,0,sizeof(client_addr));
//填写服务器结构体的信息
//AF_INET代表IPv4
server_addr.sin_family = AF_INET;
//填写服务端地址
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//填写端口号
server_addr.sin_port = htons(6666);
//1.创建socket
sockfd = socket(AF_INET,SOCK_DGRAM,0);
handle_error("socket",sockfd);
//2.绑定地址
socklen_t server_len = sizeof(server_addr);
socklen_t client_len = sizeof(client_addr);
temp_result = bind(sockfd,(struct sockaddr*)&server_addr,server_len);
handle_error("bind",temp_result);
//3. 直接可以收发信息,EOF表示结束通信
do{
// 清空缓冲区
memset(buf, 0, 1024);
temp_result = recvfrom(sockfd,buf,1024,0,(struct sockaddr*)&client_addr,&client_len);
handle_error("recvfrom",temp_result);
// 如果服务端发来的不是EOF
if(strncmp(buf,"EOF",3)!=0){
printf("received msg from %s at port %d: %s", inet_ntoa(server_addr.sin_addr), ntohs(server_addr.sin_port), buf);
strcpy(buf,"ok\n");
}else{
printf("收到结束信息 准备关闭\n");
}
// 从标准输入读取数据
temp_result = sendto(sockfd, buf, 4, 0, (struct sockaddr *)&client_addr, client_len);
handle_error("sendto", temp_result);
}while(strncmp(buf,"EOF",3));
free(buf);
return 0;
}
二、UDP客户端
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#define handle_error(cmd, result) \
if (result < 0) \
{ \
perror(cmd); \
return -1; \
}
int main(int argc,const char*argv[])
{
struct sockaddr_in server_addr,client_addr;
int sockfd,temp_result;
char *buf=malloc(sizeof(char)*1024);
//清空结构体
memset(&server_addr,0,sizeof(server_addr));
memset(&client_addr,0,sizeof(client_addr));
//填写服务器结构体的信息
//AF_INET代表IPv4
server_addr.sin_family = AF_INET;
//填写服务端地址
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//填写端口号
server_addr.sin_port = htons(6666);
//1.创建socket
sockfd = socket(AF_INET,SOCK_DGRAM,0);
handle_error("socket",sockfd);
//2.客户端不需要绑定地址
socklen_t server_len = sizeof(server_addr);
socklen_t client_len = sizeof(client_addr);
//3. 直接可以收发信息,EOF表示结束通信
do{
write(STDOUT_FILENO, "Type something you want to send: ", 34);
// 从标准输入读取数据
int buf_len = read(STDIN_FILENO, buf, 1023);
temp_result = sendto(sockfd, buf, buf_len, 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
handle_error("sendto", temp_result);
// 清空缓冲区
memset(buf, 0, 1024);
// 尝试接受数据
//填写NULL因为通过sendto,UDP会自动找到
temp_result = recvfrom(sockfd, buf, 1024, 0, NULL, NULL);
handle_error("recvfrom", temp_result);
// 如果服务端发来的不是EOF
if (strncmp(buf, "EOF", 3) != 0)
{
printf("received msg from %s at port %d: %s", inet_ntoa(server_addr.sin_addr), ntohs(server_addr.sin_port), buf);
}else{
printf("收到结束信息 准备关闭\n");
}
}while(strncmp(buf,"EOF",3));
free(buf);
return 0;
}