• Socket TCP


    套接字socket有三种类型
    流式    (SOCK_STREAM )使用 TCP
    数据报  (SOCK_DGRAM ) 使用 UDP
    原始     对低层协议如IP或ICMP直接访问

     4个函数,1个结构

    socket,bind,listen,accept

    struct sockaddr_in
    struct in_addr
    { {
    short  int  sin_family; /* Internet 地址族 */ unsigned long s_addr;   /*32位地址*/
    unsigned  short  int sin_port; /*  端 口号 号 */ }
    struct  in_addr  sin_addr; /* IP 地址 */
    unsigned  char  sin_zero[8]; /*  填0 */
    }

     在网络上标识一台机器可以用IP,也可以使用主机名 。

    struct hostent *gethostbyname(const char *hostname) 

    struct  hostent { 
           char    *h_name;                 /* official name of host */ 
           char    **h_aliases;             /* alias list */ 
           int       h_addrtype;             /* host address type */ 
           int       h_length;                 /* length of address */ 
           char    **h_addr_list;         /* list of addresses from name server */ 
    /* #if defined  __USE_MISC || defined __USE_GNU */ 
    #ifndef _POSIX_C_SOURCE 
           #define h_addr  h_addr_list[0]  /* address, for backward compatiblity */ 
           #endif                                        /* !_POSIX_C_SOURCE */ 
          };
    地址转换
    int inet_aton(const char *cp,struct in_addr *inp)  /*a.b.c.d形式转换为32位IP   储存在inp里*/
    char *inet_ntoa(struct in_addr in)         /*32位IP转换为a.b.c.d形式   */

    server_addr.sin_addr.s_addr=inet_addr("192.168.1.1");

    inet_addr()返回的地址已经是网络字节格式,所以你无需再调用函数htonl()。 

     字节序转换    32bit的整数(0x01234567)从地址0x100开始 

    小端          数据低位存放在高位地址

     

    大端          数据低位存放在低位地址

     

     网络字节采用大端

     htons    unsigned short 主机——>网络

     htonl     unsigned long   主机——>网络

     ntohs    unsigned shor   网络——>主机

     ntohl     unsigned long   网络——>主机

    #include <stdlib.h> 
    #include <stdio.h> 
    #include <errno.h> 
    #include <string.h> 
    #include <netdb.h> 
    #include <sys/types.h> 
    #include <netinet/in.h> 
    #include <sys/socket.h> 

    #define portnumber 3333

    int main(int argc, char *argv[]) 

        int sockfd,new_fd; 
        struct sockaddr_in server_addr; 
        struct sockaddr_in client_addr; 
        int sin_size; 
        int nbytes;
        char buffer[1024];
        

        /* 服务器端开始建立sockfd描述符 */ 
        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1// AF_INET:IPV4;SOCK_STREAM:TCP
        { 
            fprintf(stderr,"Socket error:%s a",strerror(errno)); 
            exit(1); 
        } 

        /* 服务器端填充 sockaddr结构 */ 
        bzero(&server_addr,sizeof(struct sockaddr_in)); // 初始化,置0
        server_addr.sin_family=AF_INET;                 // Internet
        server_addr.sin_addr.s_addr=htonl(INADDR_ANY);  // (将本机器上的long数据转化为网络上的long数据)服务器程序能运行在任何ip的主机上  //INADDR_ANY 表                                                     示主机可以是任意IP地址,即服务器程序可以绑定到所有的IP上
       
    //server_addr.sin_addr.s_addr=inet_addr("192.168.1.1");  //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ip
        server_addr.sin_port=htons(portnumber);         // (将本机器上的short数据转化为网络上的short数据)端口号
        
        /* 捆绑sockfd描述符到IP地址 */ 
        if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1
        { 
            fprintf(stderr,"Bind error:%s a",strerror(errno)); 
            exit(1); 
        } 

        /* 设置允许连接的最大客户端数 */ 
        if(listen(sockfd,5)==-1
        { 
            fprintf(stderr,"Listen error:%s a",strerror(errno)); 
            exit(1); 
        } 

        while(1
        { 
            /* 服务器阻塞,直到客户程序建立连接 */ 
            sin_size=sizeof(struct sockaddr_in); 
            if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1
            { 
                fprintf(stderr,"Accept error:%s a",strerror(errno)); 
                exit(1); 
            } 

            fprintf(stderr,"Server get connection from %s ",inet_ntoa(client_addr.sin_addr)); // 将网络地址转换成.字符串
            if((nbytes=read(new_fd,buffer,1024))==-1
            { 
                fprintf(stderr,"Read Error:%s ",strerror(errno)); 
                exit(1); 
            }         
            buffer[nbytes]='';
            printf("Server received %s ",buffer);
            /* 这个通讯已经结束 */ 
            close(new_fd); 
            /* 循环下一个 */ 
        } 

        /* 结束通讯 */ 
        close(sockfd); 
        exit(0); 

     

    #include <stdlib.h> 
    #include <stdio.h> 
    #include <errno.h> 
    #include <string.h> 
    #include <netdb.h> 
    #include <sys/types.h> 
    #include <netinet/in.h> 
    #include <sys/socket.h> 

    #define portnumber 3333

    int main(int argc, char *argv[]) 

        int sockfd; 
        char buffer[1024]; 
        struct sockaddr_in server_addr; 
        struct hostent *host; 

        if(argc!=2
        { 
            fprintf(stderr,"Usage:%s hostname a ",argv[0]); 
            exit(1); 
        } 

        /* 使用hostname查询host 名字 */
        if((host=gethostbyname(argv[1]))==NULL) 
        { 
            fprintf(stderr,"Gethostname error "); 
            exit(1); 
        } 

        /* 客户程序开始建立 sockfd描述符 */ 
        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1// AF_INET:Internet;SOCK_STREAM:TCP
        { 
            fprintf(stderr,"Socket Error:%sa ",strerror(errno)); 
            exit(1); 
        } 

        /* 客户程序填充服务端的资料 */ 
        bzero(&server_addr,sizeof(server_addr)); // 初始化,置0
        server_addr.sin_family=AF_INET;          // IPV4
        server_addr.sin_port=htons(portnumber);  // (将本机器上的short数据转化为网络上的short数据)端口号
        server_addr.sin_addr=*((struct in_addr *)host->h_addr); // IP地址
        
        /* 客户程序发起连接请求 */ 
        if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1
        { 
            fprintf(stderr,"Connect Error:%sa ",strerror(errno)); 
            exit(1); 
        } 

        /* 连接成功了 */ 
        printf("Please input char: ");
        
        /* 发送数据 */
        fgets(buffer,1024,stdin); 
        write(sockfd,buffer,strlen(buffer)); 
        /* 结束通讯 */ 
        close(sockfd); 
        exit(0);  

     

  • 相关阅读:
    Windows Server 2008 R2 免费使用 7200天 激活
    ceph部署步骤
    for循环间隔修改(解决把以空格隔开需要把一整行作为整体)
    my_learn
    fiddler-抓包
    基础软件搭建
    【原创】一层Nginx反向代理K8S化部署实践
    【原创】K8S使用ceph-csi持久化存储之CephFS
    【原创】K8S使用ceph-csi持久化存储之RBD
    [原创]自动化部署K8S(v1.10.11)集群
  • 原文地址:https://www.cnblogs.com/liuchengchuxiao/p/4312663.html
Copyright © 2020-2023  润新知