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 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。