UDP通讯模型简单示例

1. UDP通讯模型

2. 服务器端

① 创建一个socket,用函数socket()

② 绑定IP地址、端口等信息到socket上,用函数bind()

③ 循环接收数据,用函数recvfrom()

④ 关闭网络连接

3. 客户端

① 创建一个socket,用函数socket()

② 绑定IP地址、端口等信息到socket上,用函数bind()

③ 设置服务器端IP地址和端口等属性

④ 发送数据,用函数sendto()

⑤ 关闭网络连接

4. 简单示例

① 服务器端

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>

#define SERVER_PORT 8888 
#define MAX_MSG_SIZE 1024 

void udps_respon(int sockfd) 
{ 
    struct sockaddr_in addr; 
    int addrlen, n; 
    char msg[MAX_MSG_SIZE]; 

    while(1) 
    {    /* 从网络上读,并写到网络上 */ 
        bzero(msg, sizeof(msg)); // 初始化,清零
        
        addrlen = sizeof(struct sockaddr);
        
        n = recvfrom(sockfd, msg, MAX_MSG_SIZE, 0, (struct sockaddr*)&addr, &addrlen); // 从客户端接收消息
        
        msg[n] = 0;//将收到的字符串尾端添加上字符串结束标志 
        /* 显示服务端已经收到了信息 */ 
        fprintf(stdout, "Server have received %s", msg); // 显示消息
    } 
} 

int main(void) 
{ 
    int sockfd; 
    struct sockaddr_in addr; 

    /* 服务器端开始建立socket描述符 */ 
    sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if(sockfd < 0) 
    { 
        fprintf(stderr, "Socket Error:%s
", strerror(errno)); 
        exit(1); 
    } 

    /* 服务器端填充 sockaddr结构 */ 
    bzero(&addr, sizeof(struct sockaddr_in));
    
    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    addr.sin_port = htons(SERVER_PORT); 

    /* 捆绑sockfd描述符 */ 
    if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) 
    { 
        fprintf(stderr, "Bind Error:%s
", strerror(errno)); 
        exit(1); 
    } 

    udps_respon(sockfd); // 进行读写操作
    
    close(sockfd); 
} 

② 客户端

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>

#define SERVER_PORT 8888 
#define MAX_BUF_SIZE 1024 

void udpc_requ(int sockfd, const struct sockaddr_in *addr, int len) 
{ 
    char buffer[MAX_BUF_SIZE]; 
    int n; 
    
    while(1) 
    {     /* 从键盘读入,写到服务端 */ 
        printf("Please input char:
");
        
        fgets(buffer, MAX_BUF_SIZE, stdin); 
        
        sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)addr, len); 
        
        bzero(buffer, MAX_BUF_SIZE); 
    } 
} 

int main(int argc,char **argv) 
{ 
    int sockfd; 
    struct sockaddr_in addr; 

    if(argc != 2) 
    { 
        fprintf(stderr, "Usage:%s server_ip
",argv[0]); 
        exit(1); 
    }

    /* 建立 sockfd描述符 */ 
    sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if(sockfd < 0) 
    { 
        fprintf(stderr,"Socket Error:%s
",strerror(errno)); 
        exit(1); 
    } 

    /* 填充服务端的资料 */ 
    bzero(&addr, sizeof(struct sockaddr_in)); 
    
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(SERVER_PORT);
    
    if(inet_aton(argv[1], &addr.sin_addr) < 0)  /*inet_aton函数用于把字符串型的IP地址转化成网络2进制数字*/ 
    { 
        fprintf(stderr,"Ip error:%s
",strerror(errno)); 
        exit(1); 
    } 

    udpc_requ(sockfd, &addr, sizeof(struct sockaddr_in)); // 进行读写操作
    
    close(sockfd); 
}
原文地址:https://www.cnblogs.com/wulei0630/p/9469407.html