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

无法通过TCP获取客户端发送的消息

  •  -1
  • E235  · 技术社区  · 6 年前

    我用C++编写了一个客户端,并给我的本地机器发送了一个消息,它正在收听。 nc -l -p 6666 .
    发送消息后,没有发现任何问题 nc 在我的本地主机上。

    我想问题出在我的代码中,但我不确定哪一行。

    为什么我没有收到任何消息 数控 ?

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <dirent.h> 
    #include <unistd.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h> 
    
    void error(const char *msg)
    {
        perror(msg);
        exit(0);
    }
    
    int main(int argc, char *argv[]) {
    
      //http://www.linuxhowtos.org/C_C++/socket.htm
    
      int sockfd, portno, n;
      struct sockaddr_in serv_addr;
      struct hostent *server;
      const char ip[] = "127.0.0.1";
      char buffer[256];
    
      portno = atoi("6666");
      sockfd = socket(AF_INET, SOCK_STREAM, 0);
      if (sockfd < 0) {
        error("ERROR opening socket");
      }
    /*
      server = gethostbyname(argv[1]);
    
      if (server == NULL) {
          fprintf(stderr,"ERROR, no such host\n");
          exit(0);
      }
    
      bzero((char *) &serv_addr, sizeof(serv_addr));
      serv_addr.sin_family = AF_INET;
      bcopy((char *)server->h_addr, 
           (char *)&serv_addr.sin_addr.s_addr,
            server->h_length);
    */
      inet_aton(ip, &serv_addr.sin_addr);
    
      serv_addr.sin_port = htons(portno);
      if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0){ 
          error("ERROR connecting");
      }
    
      printf("Please enter the message: ");
      bzero(buffer,256);
      fgets(buffer,255,stdin);
       n = write(sockfd,buffer,strlen(buffer));
        if (n < 0) 
             error("ERROR writing to socket");
        bzero(buffer,256);
        n = read(sockfd,buffer,255);
        if (n < 0) 
             error("ERROR reading from socket");
        printf("%s\n",buffer);
        close(sockfd);
      return(0);
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Lightness Races in Orbit    6 年前

    A有三个部分 sockaddr_in :

    • 宿主
      你把这个 inet_aton (假设调用成功;最好添加一些错误检查!)
    • 端口
      你把这个 serv_addr.sin_port = htons(portno);
    • 家庭
      应该是 AF_INET 在你的情况下,但是,哎呀,你把这个评论掉了!

    其他一切看起来都很好。