gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:10:56 24 4
gpt4 key购买 nike

// 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com