UDP网络程序模型设计

UDP网络程序设计

1. UDP网络编程模型程序初始化

  1.1服务器使用的函数

    创建socket----->socket

    绑定地址-------->bind

    接受数据-------->recvfrom

    发送数据-------->sendto

    结束连接-------->close

  1.2客户机使用函数

    创建套接字------>socket

    发送数据-------->sento

    接受数据-------->recvfrom

    结束连接-------->close

二、函数学习  

  2.1 发送数据sendto

  2.1.1包含头文件

    #include <sys/types.h>
    #include <sys/socket.h>

  2.1.2函数原型

    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
    const struct sockaddr *dest_addr, socklen_t addrlen);

  2.1.3函数参数

    sockfd:创建的套接字

    *buf:要发送的数据地址

    len:数据长度

    flags:标识符

    dest_addr:目的机地址

    addrlen:地址长度

  2.1.4返回值

    实际发送的数据量

  2.2接收数据recvfrom

  2.2.1包含头文件

    #include <sys/types.h>
    #include <sys/socket.h>

  2.2.2函数原型

    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
    struct sockaddr *src_addr, socklen_t *addrlen);

  2.2.3函数参数

    sockfd:创建的套接字

    *buf:数据存放的地址

    len:数据长度

    flags:标识符

    dest_addr:数据来源方方的地址

    addrlen:地址长度的指针

  2.2.4返回值

    以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,若出错则返回-

三. 实例编写

  服务器程序  复制代码

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <sys/socket.h>
 4 #include <netinet/in.h>
 7 #define portnum 8888
 8 #define msg_size 128
 9 int main()
10 {
11     int sockfd;
12     char buffer[msg_size];
13     struct sockaddr_in server_addr;
14     struct sockaddr_in client_addr;
15     int addrlen;
16     int n;
17     //1.创建套接字
18     sockfd = socket(AF_INET,SOCK_DGRAM,0);
19     
20     //2.绑定地址
21     bzero(&server_addr,sizeof(struct sockaddr_in));
22     server_addr.sin_family = AF_INET;
23     server_addr.sin_port = htons(portnum);
24     server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
25     bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr));
26     
27     //3.接受数据
28     while(1)
29     {
30         addrlen = sizeof(struct sockaddr);   //获取数据长度地址
31         bzero(buffer,sizeof(buffer));
32         n = recvfrom(sockfd,buffer,msg_size,0,(struct sockaddr *)(&client_addr),&addrlen);
33         buffer[n] = 0;
34         printf("server received :%s
",buffer);
35     }
36     //4.结束连接
37     close(sockfd);
38     return 0;
39 }
复制代码

编译运行:

四、编写客户机代码

  touch udp_client,c

  chmod 777 udp_client.c

复制代码
复制代码
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>


#define buffer_size 128
#define portnum 8888
int main(int argc,char **argv[])
{
    int sockfd;
    char buffer[buffer_size];
    struct sockaddr_in server_addr;
    
    if(argc != 2)
    {
        printf("usage: %s server_ip
",argv[0]);
        exit(1);
    }
    //1.创建套接字
    sockfd = socket(AF_INET,SOCK_DGRAM,0);
    
    //初始化服务器地址
    bzero(&server_addr,sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(portnum);
    inet_aton(argv[1],&server_addr.sin_addr);
    
    //2.发送数据
    while(1)
    {
        printf("please input char: 
"); 
        fgets(buffer,buffer_size,stdin);
        sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr));
        bzero(buffer,buffer_size);
    }
    
    //3.关闭连接
    close(sockfd);
    return 0;
    
}
复制代码
复制代码

编译运行:

4.1则可以看到服务器运行结果

复制代码
原文地址:https://www.cnblogs.com/lvxiaoning/p/6289631.html