【问题标题】:Receiving data in C on a TCP server socket在 TCP 服务器套接字上接收 C 中的数据
【发布时间】:2012-10-17 06:44:52
【问题描述】:

我一直在尝试使用以下代码从客户端接收服务器套接字上的数据,

服务器.c

int startServer(uint16_t myPort)
{
  int listenFd = 0, connfd = 0;
  struct sockaddr_in serv_addr;

  listenFd = socket(AF_INET, SOCK_STREAM, 6);
  if (listenFd == -1) {
    perror("socket");
    return EXIT_FAILURE;
  }

  memset(&serv_addr, '0', sizeof(serv_addr));

  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  serv_addr.sin_port = htons(myPort);

  if (-1 == bind(listenFd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))) {
    perror("bind");
    return EXIT_FAILURE;
  }

  if (-1 == listen(listenFd, 10)) {
    perror("listen");
    return EXIT_FAILURE;
  }

  printf("Server listening on %d\n", myPort);

  int n = 0, k;
  char recvBuff[1024];
  struct sockaddr_in conn_addr;
  unsigned int len = sizeof(conn_addr);

  while(1)
  {
     connfd = accept(listenFd, (struct sockaddr*)NULL, NULL);

     n = recv(connfd, &recvBuff, 1023, 0);
     printf("Recd: %d bytes\n",n);
     for (k=0; k<16; ++k) { printf("%d: 0x%02X, ", k, recvBuff[k]); }

     sleep(1);
   }
}

在client.c中

int main(int argc, char *argv[])
{
    int sockfd = 0, n = 0;
    struct sockaddr_in serv_addr; 

    if(argc != 2)
    {
        printf("\n Usage: %s <ip of server> \n",argv[0]);
        return 1;
    } 

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("\n Error : Could not create socket \n");
        return 1;
    } 

    memset(&serv_addr, '0', sizeof(serv_addr)); 

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(5000); 

    if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
    {
        printf("\n inet_pton error occured\n");
        return 1;
    } 

    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
       printf("\n Error : Connect Failed \n");
       return 1;
    } 

    uint32_t dataVal = 0xa0b0c0d0;
    int res = write(sockfd, (void*)&dataVal, sizeof(dataVal));
    printf("%d bytes sent\n", res);
    close(sockfd);
    return 0;
}

但是,我看到服务器说它收到了字节,但是打印字节之后的行(在 for 循环中)似乎从未执行过。有谁知道我在这里做错了什么?

【问题讨论】:

  • 在 for 循环后添加 printf("\n");(或在 for 循环内的 printf 中添加“\n”)有帮助吗?
  • 你试过使用调试器吗?
  • memset 调用错误:memset(&amp;serv_addr, '0', sizeof(serv_addr)); 将内存设置为 字符 '0',即值 48。
  • 记住输出到stdout缓冲的。打印换行符会刷新执行实际打印的缓冲区。
  • 在服务器端完成connfd之后,你应该close()它...

标签: c sockets networking tcp


【解决方案1】:

在 for 循环后添加 printf("\n");,或在 for 循环内的 printf 中添加“\n”。

printf 写入缓存的stdout。这意味着在缓冲区被填充、刷新或发送换行符之前不会显示输出。因此,通过发送换行符来确保输出是最简单的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 2017-07-17
    • 2020-12-11
    • 2023-03-23
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多