• linux 网络编程


    int socket(int domain, int type, int protocol);

    建立新的通信端口

    int domain  网络层协议 可以填 AF_INET表示IPv4AF_INET6表示IPv6

    int type  传输类型 可以填SOCK_STREAM  表示TCP  SOCK_DGRAM  调试UDP

    int protocol  指定传输协议编号,这里填0

    返回值:成功→套接字文件描述符  失败→ -1

    int serfd;
    serfd = socket(AF_INET,SOCK_STREAM,0);
    if(serfd == -1)
    {
      perror(“socket fail”);
      exit(-1);
    }

    int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

    将服务器的地址信息与套接字进行绑定

    int sockfd          套接字文件描述符

    const struct sockaddr *addr  指向服务器地址信息的指针

    struct sockaddr_in {
      unsigned short int sin_family;  网络层协议对应的宏 AF_INET表示IPv4

      uint16_t sin_port;        端口号

      struct in_addr sin_addr;      IP地址
      unsigned char sin_zero[8];     无意义
    }

    struct in_addr {

      uint32_t s_addr;        IP地址 这里是32位的二进制 

    }

    socklen_t addrlen      服务器地址信息长度 sizeof(struct sockaddr)

    返回值:成功 0  失败-1 

     1 #include <sys/socket.h>
     2 #include <netinet/in.h>
     3 #include <arpa/inet.h>
     4 
     5 //IP地址
     6 #define IP_ADDR 192.168.1.1
     7 //端口号
     8 #define PORT_name 2222
     9 
    10 //字节序转换,把主机的字节序转换成网络字节序
    11 sin_port = htons(PORT_name);
    12 
    13 //把十进制IP转化为二进制,并返回给上述中的结构体成员
    14 s_addr = inet_addr(IP_ADDR);

    int listen(int sockfd, int backlog);

    创建监听队列 

    int sockfd    套接字文件描述符

    int backlog    监听队列长度 等待连接的客户端个数 

    返回值: 成功 0  失败  -1 

    int ret;
    ret = listen(serfd , 10);
    if(ret == -1)
    {
       perror(“listen fail”);
       exit(-1);
    }

    int accept(int s,struct sockaddr * addr,int * addrlen);

    等待一个客户端与之链接,使用一次连接一个客户端

    int s            服务器套接字文件描述符

    struct sockaddr * addr    指向客户端地址

    int * addrlen        指向客户端地址信息长度

    返回值:成功返回客户端套接字文件描述符    失败 -1 

    ssize_t recv(int sockfd, void *buf, size_t len, int flags);

    等待接收网络通信的数据

    int sockfd     通信对方的套接字文件描述符 

    void *buf      指向接受内容

    size_t len      接收的最大长度  单位byte

    int flags      填0

    返回值: 实际接收数据长度 单位byte  失败 -1

    ssize_t send(int sockfd, const void *buf, size_t len, int flags);

    在网络通信中发送内容

    int sockfd        对方的套接字文件描述符

    const void *buf      发送内容的指针

    size_t len        发送长度

    int flags          填0

    返回值:成功返回实际发送的长度   失败 -1

    int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

    客户端主动连接服务器 (服务器必须已经在accept等待中)

    int sockfd            套接字文件描述符

    const struct sockaddr *addr      指向服务器地址信息的指针

    socklen_t addrlen         服务器地址信息的长度 

    返回值: 成功 0 失败 -1

    int sendto( int s , const void * msg, int len, unsigned int flags, const struct sockaddr * to , int tolen ) ;

    往指定地址的主机发送消息

    int s              套接字文件描述符

    const void * msg          发送内容的指针

    int len              发送的长度

    unsigned int flags          一般填0

    const struct sockaddr * to      指向对方地址信息的指针

    int tolen              地址信息长度

    返回值: 成功 发送信息数据的长度 失败 -1 

    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

    接收一个数据并获得发送方地址信息

    int sockfd            套接字文件描述符  

    void *buf            储存接收到的信息

    size_t len            预计接受长度

    int flags            一般填0

    struct sockaddr *src_addr      储存发送方地址信息

    socklen_t *addrlen        发送方地址信息的长度

    返回值: 成功 接受信息数据的长度   失败 -1 

    TCP案例:

    客户端:

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define  SERVER_IP  "192.168.1.7"
    #define  PORT_NUM    11111
    typedef  struct sockaddr  SA;
    typedef  struct sockaddr_in  SIN;
    
    int main(void)
    {
        char t_buf[40];
        char r_buf[40];
        SIN seraddr,cliaddr;
        int serfd,clifd;
        int ret;
        int recv_len,send_len;
        socklen_t addrlen;
        //1. 创建套接字
        serfd = socket(AF_INET,SOCK_STREAM,0);
        if(serfd == -1)
        {
        perror("socket fail");
        exit(-1);
        }
    
        //2. 编写服务器地址信息
        bzero(&seraddr,sizeof(SIN));
        seraddr.sin_family = AF_INET ;     // AF_INET-- IPv4
        seraddr.sin_port = htons (PORT_NUM) ;
        seraddr.sin_addr.s_addr = inet_addr(SERVER_IP) ;     //IP地址
    
        //3. 连接服务器
        ret = connect(serfd , (SA*)&seraddr , sizeof(SA));
        if(ret == -1)
        {
        perror("connect fail");
        exit(-1);
        }
    
        printf("connect success
    ");
        
        //4. 数据传输
        while(1)
        {
            
            scanf("%s",t_buf);
            send_len = send(serfd , t_buf , sizeof(t_buf) , 0);
            printf("send:%s
    ",t_buf);
            printf("send succese!");
    /*
            recv_len = recv(serfd , r_buf , sizeof(r_buf) , 0);
            printf("recv:%s
    ",r_buf);
    */
        }
    
        //5. 结束通信
        close(serfd);
    
        exit(0);
    }

    服务器:

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define  SERVER_IP  "192.168.1.7"
    #define  PORT_NUM    11111
    typedef  struct sockaddr  SA;
    typedef  struct sockaddr_in  SIN;
    
    int main(void)
    {
        char t_buf[40];
        char r_buf[40];
        SIN seraddr,cliaddr;
        int serfd,clifd;
        int ret;
        int recv_len,send_len;
        socklen_t addrlen;
        //1. 创建套接字
        serfd = socket(AF_INET,SOCK_STREAM,0);
        if(serfd == -1)
        {
        perror("socket fail");
        exit(-1);
        }
    
        //2. 编写服务器地址信息
        bzero(&seraddr,sizeof(SIN));
        seraddr.sin_family = AF_INET ;     // AF_INET-- IPv4
        seraddr.sin_port = htons (PORT_NUM) ;
        seraddr.sin_addr.s_addr = inet_addr(SERVER_IP) ;     //IP地址
    
        //3. 将服务器地址信息与套接字进行绑定
        ret = bind(serfd,(SA*)&seraddr,sizeof(SA));
        if(ret == -1)
        {
        perror("bind fail");
        exit(-1);
        }
    
        //4. 设置监听队列
        ret = listen(serfd , 10);
        if(ret == -1)
        {
        perror("listen fail");
        exit(-1);
        }
    
        //5. 等待与客户端连接
        clifd = accept(serfd,(SA*)& cliaddr,&addrlen);
        if(clifd == -1)
        {
        perror("accept fail");
        exit(-1);
        }
        
        printf("connect success
    ");
        
        //6. 数据传输
        while(1)
        {
            
            recv_len = recv(clifd,r_buf,sizeof(r_buf),0);
            printf("recv:%s
    ",r_buf);
            printf("received succese!");
            /*
            scanf("%s",t_buf);
            send_len = send(clifd,t_buf,sizeof(t_buf),0);
            printf("send:%s
    ",t_buf);
            */
        }
    
        //7. 结束通信
        close(clifd);
        close(serfd);
    
        exit(0);
    }

    UDP:

    客户端:

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define  SERVER_IP  "192.168.1.7"
    #define  PORT_NUM    11111
    typedef  struct sockaddr  SA;
    typedef  struct sockaddr_in  SIN;
    
    int main(void)
    {
        char t_buf[40];
        char r_buf[40];
        SIN seraddr,cliaddr;
        int serfd,clifd;
        int ret;
        int recv_len,send_len;
        socklen_t addrlen;
        //1. 创建套接字
        serfd = socket(AF_INET,SOCK_DGRAM,0);
        if(serfd == -1)
        {
        perror("socket fail");
        exit(-1);
        }
    
        //2. 编写服务器地址信息
        bzero(&seraddr,sizeof(SIN));
        seraddr.sin_family = AF_INET ;     // AF_INET-- IPv4
        seraddr.sin_port = htons (PORT_NUM) ;
        seraddr.sin_addr.s_addr = inet_addr(SERVER_IP) ;     //IP地址
    
        //3. 连接服务器
        ret = connect(serfd , (SA*)&seraddr , sizeof(SA));
        if(ret == -1)
        {
        perror("connect fail");
        exit(-1);
        }
    
        //先发送客户姓名
        /*
        printf("connect success
    ");
        printf("please input your name:
    ");
        bzero(t_buf,sizeof(t_buf));
        scanf("%s",t_buf);
        send_len = send(serfd , t_buf , sizeof(t_buf) , 0);
        */
        //4. 数据传输
        while(1)
        {
            //清除输入缓冲区,冲洗流中的信息
            fflush(stdin);
            bzero(t_buf,sizeof(t_buf));
            scanf("%s",t_buf);
            send_len = send(serfd,t_buf,sizeof(t_buf),0);
            printf("send to server:%s
    ",t_buf);
            if(strcmp(t_buf,"QUIT")==0)
            {
                close(serfd);
                exit(0);
            }
        }
    
        //5. 结束通信
        close(serfd);
        exit(0);
    }

    服务器:

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define  SERVER_IP  "192.168.1.7"
    #define  PORT_NUM    11111
    typedef  struct sockaddr  SA;
    typedef  struct sockaddr_in  SIN;
    
    int main(void)
    {
        char t_buf[40]={0};
        char r_buf[40]={0};
        SIN seraddr,cliaddr;
        int serfd,clifd;
        int ret;
        int recv_len,send_len;
        socklen_t addrlen;
        int reuse=1;
    
        //1. 创建套接字
        serfd = socket(AF_INET,SOCK_DGRAM,0);
        if(serfd == -1)
        {
        perror("socket fail");
        exit(-1);
        }
    
        //2. 编写服务器地址信息
        bzero(&seraddr,sizeof(SIN));
        seraddr.sin_family = AF_INET ;     // AF_INET-- IPv4
        seraddr.sin_port = htons (PORT_NUM) ;
        seraddr.sin_addr.s_addr = inet_addr(SERVER_IP) ;     //IP地址
    
        //3. 将服务器地址信息与套接字进行绑定
        ret = bind(serfd,(SA*)&seraddr,sizeof(SA));
        if(ret == -1)
        {
        perror("bind fail");
        exit(-1);
        }
        
        do
        {
        recv_len = recvfrom(serfd,r_buf,sizeof(r_buf),0,
                (SA*)&cliaddr,&addrlen);
        }
        while(recv_len == 0);
        printf("connect success
    ");
        //4. 数据传输
        while(1)
        {
            bzero(r_buf,sizeof(r_buf));
            recv_len = recvfrom(serfd,r_buf,sizeof(r_buf),0,
                (SA*)&cliaddr,&addrlen);
            printf("recv:%s
    ",r_buf);
            printf("client_addr is %s
    ", inet_ntoa(cliaddr.sin_addr));
    
        }
    
        //5. 结束通信
        close(serfd);
    
        exit(0);
    }
  • 相关阅读:
    javascript:属性的操作
    javascript:Element 节点
    javascript:ParentNode 接口,ChildNode 接口
    javascript:NodeList 接口,HTMLCollection 接口
    javascript:Node接口
    javascript:DOM概述
    javascript:Promise 对象
    javascript:定时器
    javascript:异步操作概述
    javascript:严格模式
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/11692833.html
Copyright © 2020-2023  润新知