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

标签 c linux sockets netcat

我用 C\C++ 编写了一个客户端,并向正在使用 nc -l -p 6666 监听的本地计算机发送了一条消息。
发送消息后,我的本地主机上的 nc 没有捕获到任何内容。

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

为什么我没有收到任何 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);
}

最佳答案

sockaddr_in 分为三个部分:

  • 主持人
    您可以使用 inet_aton 进行设置(假设调用成功;最好添加一些错误检查!)
  • 端口
    您可以使用 serv_addr.sin_port = htons(portno);
  • 进行设置
  • 家庭
    在你的情况下应该是 AF_INET 但是,哎呀,你把它注释掉了!

其他一切看起来都很好。

关于无法获取客户端通过 TCP 发送的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54075172/

相关文章:

c - C 中使用数组堆栈的括号检查器每次都不会产生正确的输出

docker - 解封80端口/nginx/docker

Matlab 和 C 使用套接字进行通信

php - 在 .htaccess 中为 LiteSpeed 缓存获取 PHP $_SESSION 数据

c# - 如何获取 IMemoryCache 中 key 的 AbsoluteExpiration DateTimeOffset

python - Python s.recv()返回空字符串

c - 在c中构建一棵二叉树

C - 检查结构体数组的所有值是否返回相同的值

c - 为什么 -o 与 gcc 会改变输出

php - 在 Linux 上为 SYMFONY 2 将 Doctrine 2 连接到 MSSQL