Linux_C socket 数据报之一些辅助函数
1 /******************************************************************** 2 * dgram.c 3 * support functions for datagram based programs 4 */ 5 #include <stdio.h> 6 #include <unistd.h> 7 #include <sys/types.h> 8 #include <sys/socket.h> 9 #include <netinet/in.h> 10 #include <arpa/inet.h> 11 #include <netdb.h> 12 #include <string.h> 13 14 #define HOSTLEN 256 15 16 int make_internet_address(); 17 /********************************************************************* 18 * 对于UDP(数据报服务器端)没有TCP那么复杂。 19 * 服务器端应用层主要调用: 20 * fd=socket(); 21 * bind(fd, 服务器地址端口),绑定fd的源地址,目标地址任意 22 * (循环多次以下) 23 * recvfrom(fd, buf, size, addr) 阻塞等待客户端数据请求,可以从addr得知是谁发来的请求 24 * recvfrom返回 处理客户端请求 25 * sendto(connfd, buf, size ,addr) 给客户端地址端口addr发送数据应答 26 ********************************************************************/ 27 int make_dgram_server_soket(int portnum) { 28 struct sockaddr_in saddr; /*build our address here*/ 29 char hostname[HOSTLEN]; /*address*/ 30 int sock_id; /*the socket*/ 31 32 sock_id=socket(PF_INET, SOCK_DGRAM, 0); /*get a socket*/ 33 if(sock_id == -1) return -1; 34 35 /** build address and bind it to socket**/ 36 37 gethostname(hostname, HOSTLEN); 38 make_internet_address(hostname, portnum, &saddr); 39 40 if(bind(sock_id, (struct sockaddr*)&saddr, sizeof(saddr))!=0) 41 return -1; 42 43 return sock_id; 44 } 45 /********************************************************************* 46 * 对于UDP(数据报客户端) 没有TCP那么复杂 47 * 客户端应用层主要调用: 48 * fd=socket()分配一个文件描述符 49 * (循环多次以下) 50 * sendto(fd, buf, size, addr) 向服务器地址端口addr发送数据请求 51 * recvfrom(fd, buf, size, addr) 阻塞等待应答 52 * recvfrom返回 53 * 循环结束 54 * close(fd)关闭文件描述符 55 ********************************************************************/ 56 int make_dgram_client_socket(){ 57 return socket(PF_INET, SOCK_DGRAM, 0); 58 } 59 60 int make_internet_address(char* hostname, int port, struct sockaddr_in *addrp) { 61 /* 62 * constructor for an Internet socket address , uses hostname and port 63 * (host, port) -> *addrp; 64 */ 65 struct hostent *hp; 66 67 bzero((void*)addrp, sizeof(struct sockaddr_in)); 68 hp=gethostbyname(hostname); 69 if(hp==NULL) return -1; 70 bcopy((void*)hp->h_addr, (void*)&addrp->sin_addr, hp->h_length); 71 addrp->sin_port=htons(port); 72 addrp->sin_family=AF_INET; 73 return 0; 74 } 75 76 int get_internet_address(char* host, int len, int *portp, struct sockaddr_in *addrp) { 77 /* 78 * extracts host and port from an internet socket address 79 * *addrp->(host, port) 80 */ 81 strncpy(host, inet_ntoa(addrp->sin_addr), len); 82 *portp=nthos(addrp->sin_port); 83 return 0; 84 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。