c - 如何停止我的 tcp echo 服务器以正确的方式工作?

标签 c sockets server client

// A simple echo server
// ./server port_no

#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<error.h>
#include<strings.h>
#include<unistd.h>
#include<arpa/inet.h>



#define ERROR -1
#define MAX_CLIENTS 2
#define MAX_DATA 1024



main(int argc, char **argv)
{
  struct sockaddr_in server;
  struct sockaddr_in client;
  int sock;
  int new;
  int sockaddr_len = sizeof(struct sockaddr_in);
  int data_len;
  char data[MAX_DATA];


  if((sock = socket(AF_INET , SOCK_STREAM, 0)) == ERROR)
  {
       perror("server socket: ");
       exit(-1);   
  }

  server.sin_family = AF_INET;
  server.sin_port = htons(atoi(argv[1]));
  server.sin_addr.s_addr = INADDR_ANY;
  bzero(&server.sin_zero,8);


  if((bind(sock , (struct sockaddr *)&server, sockaddr_len)) == ERROR)
  {
          perror("bind : ");
          exit(-1);
  }

  if((listen(sock, MAX_CLIENTS)) == ERROR)
  {
         perror("listen");
         exit(-1);
  }          

  while(1) //Better signal handling required
  {
      if((new == accept(sock, ( struct sockaddr *)&client , &sockaddr_len)) == ERROR)
      {
         perror("accept"); 
         exit(-1); 
      }


 printf("New Client connected from port no %d and IP %s\n",ntohs(client.sin_port),inet_ntoa(client.sin_addr));
 data_len = 1;

 while(data_len)
    {      
       data_len = recv(new,data , MAX_DATA, 0);

             if(data_len)
               {
                    send(new, data, data_len, 0);
                    data[data_len] = '\0' ; // null the last byte to detect string
                    printf("Sent mesg: %s", data);
               }
    }

 printf("Client disconnected\n");

 close(new);
}


close(sock);

}

嗨,我一直在学习 C 套接字编程。最近我为 tcp echo 服务器编写了一个代码。当我使用 netstat 命令时,服务器确实显示已连接,但是一旦我使用 telnet 运行代码,它就会开始打印无限消息,而不是等待我在其他终端中写入消息。请帮我弄清楚我哪里出了问题。

最佳答案

无限循环的原因是代码

f((new == accept(sock, ( struct sockaddr *)&client , &sockaddr_len)) == ERROR)

应该是

f((new = accept(sock, ( struct sockaddr *)&client , &sockaddr_len)) == ERROR)

这是 == 与 =。使用==时,accept()返回的套接字永远不会分配给new,因此对其调用recv()返回-1(在本例中为错误),并且因为代码不检查错误,正如艾伦指出的那样Au,结果是无限循环。

顺便说一句,如果您观看编译器警告或使用开关启用更多警告,例如-使用 gcc 进行墙,通常可以深入了解代码中可能出现的问题。

关于c - 如何停止我的 tcp echo 服务器以正确的方式工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32620854/

相关文章:

c - 通用C程序

sockets - 连接被对等方重置 : socket write error during ftp

java - java服务器存在安全风险?

java - 重新解析 Map 的干净方法

使用fifos的客户端服务器,发送突发和接收处理时间

java - 如何使用 cron 调度线程获取服务器 URL?

java - Netbeans 中央存储库的解包索引

c - 如何在不违反严格的别名规则的情况下有效地从 char 缓冲区复制小数据?

c - 每次调用父函数时是否重新分配 C 中的静态变量?

c - 半动态分配代码在 C++ 中有效,但在 C 中无效,为什么?