(本节笔记的实验代码,在这里)
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; }