• [zz]Linux 下 socket 编程示例


    本示例为 Client/Server 结构,通过代码演示 Client 如何建立连接,并向远程端发送数据;Server 端如何侦听系统连接请求,接收请求并建立连接,进而获取客户端发来的数据。代码虽短,却描述了整个通信过程,可对Linux 下 网络编程起个抛砖引玉的作用吧 :-)

    Client 端代码:
    --------------------------------------------------------------
    /* sockclnt.c*/
    #include <string.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h> /*for struct sockaddr_in*/

    #define DEST_IP   "65.52.207.217"
    #define DEST_PORT 4000

    int main()
    {
      int res;
      int sockfd;
      struct sockaddr_in dest_addr;

      char *msg = "Hello world\n";
      int len, bytes_sent;

      /* 取得一个套接字*/
      sockfd = socket(AF_INET, SOCK_STREAM, 0);
      if (sockfd == -1) {
        perror("socket()");
        exit(1);
      }

      /* 设置远程连接的信息*/
      dest_addr.sin_family = AF_INET;                 /* 注意主机字节顺序*/
      dest_addr.sin_port = htons(DEST_PORT);          /* 远程连接端口, 注意网络字节顺序*/
      dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); /* 远程 IP 地址, inet_addr() 会返回网络字节顺序*/
      bzero(&(dest_addr.sin_zero), 8);                /* 其余结构须置 0*/

      /* 连接远程主机,出错返回 -1*/
      res = connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in));
      if (res == -1) {
        perror("connect()");
        exit(1);
      }

      len = strlen(msg);
      bytes_sent = send(sockfd, /* 连接描述符*/
                        msg,    /* 发送内容*/
                        len,    /* 发关内容长度*/
                        0);     /* 发送标记, 一般置 0*/

      /* 关闭连接*/
      close(sockfd);
    }


    Server 端的代码:
    -----------------------------------------------------------------------------------------
    /* socksrv.c*/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h> /* for struct sockaddr_in*/

    #define BACKLOG 10
    #define MYPORT  4000

    int main()
    {
      char *addr;
      int sockfd;
      int new_fd;
      struct sockaddr_in my_addr, their_addr;

      int res;
      int sin_size;

      char *buf;
      /* 取得套接字描述符*/
      sockfd = socket(AF_INET,     /* domain*/
                      SOCK_STREAM, /* type*/
                      0);          /* protocol*/

      if (sockfd == -1) {
        perror("socket");
        exit(1);
      }

      /* Init sockaddr_in */
      my_addr.sin_family = AF_INET;                /* 注意: 应使用主机字节顺序*/
      my_addr.sin_port = htons(MYPORT);            /* 注意: 应使用网络字节顺序*/
      my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* 使用自己的 IP 地址 */
      bzero(&(my_addr.sin_zero), 8);               /* 结构的其余的部分须置 0*/

      /* 指定一个套接字使用的地址及端口*/
      res = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));
      if (res == -1) {
        perror("bind");
        exit(1);
      }

      /* 监听请求, 等待连接*/
      res = listen(sockfd,
                   BACKLOG);  /* 未经处理的连接请求队列可容纳的最大数目*/               
      if (res == -1) {
        perror("listen");
        exit(1);
      }

      /* 接受对方的连接请求, 建立连接,返回一个新的连接描述符.
       * 而第一个套接字描述符仍在你的机器上原来的端口 listen()
       */
      sin_size = sizeof(struct sockaddr_in);
      new_fd = accept(sockfd, (void *)&their_addr, &sin_size);

      buf = (char *)malloc(255);
      if (buf == NULL) {
        printf("malloc failed\n");
        exit(1);
      }

      /* 接受对方发来的数据*/
      res = recv(new_fd, buf, 255, 0);
      if (res == -1) {
        perror("recv()");
        exit(1);
      }

      /* 关闭本次连接*/
      close(new_fd);

      /* 关闭系统监听*/
      close(sockfd);

      printf("recv data:%s\n", buf);
      free(buf);
      return 0;
    }

    编译:
    ------------------------------------------------
    gcc -o sockclnt sockclnt.c
    gcc -o socksrv  socksrv.c

  • 相关阅读:
    preg_replace函数/e后门
    php7.0-7.3的bypass disable_function一把梭
    PHP反序列化逃逸
    day2filter_var函数漏洞
    基于 Elasticsearch 聚合搜索实现电商筛选查询功能
    基于SpringBoot + Redis + 轮询实现扫码登录
    教你理解Lambda表达式
    记录解决 Elasticseach 过滤与聚合问题
    基于 MyBatis-Plus 解决数据库逻辑删除与唯一索引问题
    Java8 Stream Lamdba sorted()排序遇到的小坑
  • 原文地址:https://www.cnblogs.com/zhangzhang/p/2422933.html
Copyright © 2020-2023  润新知