2-24UDP网络程序设计

    xiaoxiao2022-06-24  29

    (本节笔记的实验代码,在这里)

    1.  UDP编程模型函数化

        1.1  server端函数         创建socket——>socket();         绑定地址   ——>bind();         接收数据   ——>recvfrom();         发送数据   ——>sendto();         结束连接   ——>close();     1.2  client端函数         创建socket——> socket();         接收数据   ——>recvfrom();         发送数据   ——>sendto();         结束连接   ——>close(); 2.  函数学习     2.1接收数据         函数名:                 recvfrom         函数原型: man recvfrom                 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct_sockaddr *src_addr, socklen_t *addrlen);         函数功能:                 控制如何接收数据。         所属头文件:                 <sys/types.h> <sys/socket.h>         返回值:                 成功 :返回接收数据的大小         失败 :返回-1         参数说明:                  sockfd : server端套接字ID。                 *buf :接收的数据存放的地址。                 len :接收的数据大小。                 flags :标志位,如果不需要设置可以直接设为0。                 *src_addr : 一个struct sockaddr结构的指针,里面存有发送方的地址。 //一般用法为(struct sockaddr *)(&struct sockaddr_in)                 *addrlen :发送方地址长度(变量)的地址。     2.2发送数据         函数名:                 sendto         函数原型: man sendto                 ssize_t send(int sockfd, const void *buf, size_t len, int flags, struct_sockaddr *src_addr, socklen_t *addrlen);         函数功能:                 控制如何发送数据。         所属头文件:                 <sys/types.h>         <sys/socket.h>         返回值:                 成功 :返回发送数据的大小         失败 :返回-1         参数说明:                 sockfd : client端套接字ID。                 *buf :发送的数据存放的地址。                 len :发送的数据大小。                 flags :标志位,如果不需要设置可以直接设为0。                 *src_addr : 一个struct sockaddr结构的指针,里面存有接收方的地址。 //一般用法为(struct sockaddr *)(&struct sockaddr_in)                 addrlen :接收方地址长度。 3.  综合实例 /*  touch server.c  */ /* 利用UDP协议进行网络通讯的服务器端程序 */

    #include <stdio.h>

    #include <sys/socket.h>

    #include <string.h> #include <stdlib.h> #include <unistd.h> #include <netinet/in.h> #define PORTNUM 3333 int main() { int sockfd; int recv_sz; long addr_len; char buff[128]; struct sockaddr_in server_addr; struct sockaddr_in client_addr; /* 1.创建socket */ if(-1 == (sockfd = socket(AF_INET, SOCK_STREAM, 0))) { printf("create socket error!\n"); exit(1); } /* 2.绑定地址 */ bzero(&server_addr, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORTNUM); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)); while(1) { addr_len = sizeof(struct sockaddr); /* 3.接收数据 */ bzero(buff, sizeof(buff)); recv_sz = recvfrom(app_sockfd, buff, 128, 0, (struct sockaddr *)(&client_addr), sizeof(struct sockaddr) , (socklen_t *)(&addr_len) ); printf("server get connection from:%s\n", inet_ntoa(client_addr.sin_addr)); buffer[recv_sz] = '\0'; printf("server received %s\n", buff); } /* 4.结束连接 */ close(sockfd); return 0; }                                                                    /*  touch client.c  */

    /* 利用UDP协议进行网络通讯的客户端程序 */

    #include <stdio.h> #include <sys/socket.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <netinet/in.h> #define PORTNUM 3333 int main(int argc, char **argv) { int sockfd; int send_sz; char buff[128]; struct sockaddr_in server_addr; if(argc != 2) { printf("Usage: %s server_ip\n", argv[0]); exit(1); } /* 1.创建socket */ if(-1 == (sockfd = socket(AF_INET, SOCK_STREAM, 0))) { printf("create socket error!\n"); exit(1); } /* 2.连接服务器 */ 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.s_addr); /* 3.发送数据 */ printf("Please input something:\n"); fgets(buff, 128, stdin); sendto(sockfd, buffe, strlen(buffer), 0, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)); /* 5.结束连接 */ close(sockfd); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1123741.html

    最新回复(0)