代码之家  ›  专栏  ›  技术社区  ›  Jsevillamol

在本地测试TCP/IP服务器

  •  0
  • Jsevillamol  · 技术社区  · 6 年前

    我用C语言编写了一个echo tcp服务器。

    我想测试一下我的代码,看看它是否有效。

    #include <sys/socket.h>
    #include <sys/un.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    
    #define BUF_SIZE 500
    #define LISTEN_BACKLOG 50
    
    #define handle_error(msg) \
       do { perror(msg); exit(EXIT_FAILURE); } while (0)
    
    int
    main(int argc, char *argv[])
    {
       struct addrinfo hints;
       struct addrinfo *res, *rp;
       struct sockaddr_storage peer_addr;
       socklen_t peer_addr_len;
       int sfd, cfd;
    
       if(argc != 3) {
          fprintf(stderr, "Usage: %s address port\n", argv[0]);
          exit(EXIT_FAILURE);
       }
    
       memset(&hints, 0, sizeof(struct addrinfo));
       hints.ai_family = AF_UNSPEC;
       hints.ai_socktype = SOCK_STREAM;
       hints.ai_flags = AI_PASSIVE;
       hints.ai_protocol = 0;
       hints.ai_addr = NULL;
       hints.ai_next = NULL;
    
       if(getaddrinfo(argv[1], argv[2], &hints, &res) != 0)
          handle_error("getaddrinfo");
    
       // Try each socket until we bind
       for(rp = res; rp != NULL; rp = rp->ai_next){
          sfd = socket(rp->ai_family, rp->ai_socktype, 0);
          if(sfd == -1) continue;
          if(bind(sfd, rp->ai_addr, rp->ai_addrlen) == 0) break;
          else close(sfd);
       }
    
       freeaddrinfo(res);
    
       if (rp == NULL){
          fprintf(stderr, "Could not bind to any socket\n");
          exit(EXIT_FAILURE);
       }
    
       // Set the TCP socket to listen state
       if (listen(sfd, LISTEN_BACKLOG) == -1) handle_error("listen");
    
       for(;;){
          // Accept
          peer_addr_len = sizeof(struct sockaddr_storage);
          cfd = accept(sfd, (struct sockaddr *) &peer_addr, &peer_addr_len);
          if (cfd == -1) handle_error("accept");
    
          // Fork
          pid_t pid = fork();
    
          if (pid == 0){
             //Child code
             char buf[BUF_SIZE];
             while(1){
                 ssize_t nread = recv(cfd, buf, BUF_SIZE, 0);
                 if (nread == 0) {
                     close(cfd);
                     exit(EXIT_SUCCESS);
                 } else {
                     ssize_t nsent = send(cfd, buf, nread, 0);
                     if (nsent != nread) fprintf(stderr, "Error sending response");
                 }
    
             }
          } else {
             //Parent code
    
          }
       }
       close(sfd);
    } 
    

    它编译得很好,但是当我尝试将其作为 tcp_server 127.0.0.1 80 它给了我错误信息 Could not bind to any socket .

    据我所知,这应该将服务器绑定到IPv4环回地址、端口80,然后我就可以使用 netcat .

    怎么回事?

    2 回复  |  直到 6 年前
        1
  •  1
  •   David Schwartz    6 年前

    低编号端口被大多数操作系统认为是特权端口。尝试使用类似8000或8080的端口。

        2
  •  0
  •   deepakbhavale67    6 年前

    因为您通过命令行参数(即argv[2])传递端口80。端口号80是分配给常用的Internet通信协议、超文本传输协议(HTTP)的端口号。

    您可以根据以下分类使用端口: 1。端口0_“1023_”系统或知名端口 2。端口1024_“49151_”用户或注册端口 三。端口>49151_“动态/专用端口”

    因此,通过这种方式,你的问题就会得到解决。