• 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 }
  • 相关阅读:
    PHP底层工作原理
    php WebSocket 简单实现demo
    php部署调优
    php简单随机实现发红包程序
    在Android中调用USB摄像头
    在addroutes后,$router.options.routes没有更新的问题(手摸手,带你用vue撸后台 读后感)
    Vue+elementUI开发中 Cannot read property 'resetFields' of undefined 问题解决以及原因分析
    如何在debug vue-cli建立的项目
    在Node.js使用Promise的方式操作Mysql(续)
    express框架中如何只执行一次res响应操作
  • 原文地址:https://www.cnblogs.com/wizzhangquan/p/4100368.html
Copyright © 2020-2023  润新知