首页 > 代码库 > 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 数据报之一些辅助函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。