首页 > 代码库 > Linux_C socket 数据报之一些辅助函数

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 25615 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 port63  * (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 address79  * *addrp->(host, port)80  */81   strncpy(host, inet_ntoa(addrp->sin_addr), len);82   *portp=nthos(addrp->sin_port);83   return 0;84 }

 

Linux_C socket 数据报之一些辅助函数