gpt4 book ai didi

c - TCP 连接的错误和意外行为

转载 作者:行者123 更新时间:2023-11-30 16:03:35 24 4
gpt4 key购买 nike

我希望我的 TCP 服务器和客户端能够根据对方所说的内容相互“交谈”。但是当我运行时,它似乎经历了一次迭代,但随后服务器和客户端似乎都“挂”在那里。一旦我在客户端杀死它,我最终会得到一个损坏的管道错误。

任何人都可以解释我在这里做错了什么吗?

服务器代码片段:

while(feof(file_ptr) == 0)
{
fscanf(file_ptr, "%s", supplies);
printf("%s\n", supplies);

//SEND supplies to all clients (currently just one client)

n = write(newsockfd, supplies, strlen(supplies));

if (n < 0)
{
error("ERROR writing to socket");
}


//Receive a request from client that they can use supply

bzero(buffer,2);
n = read(newsockfd,buffer,2);

if (n < 0)
{
error("ERROR reading from socket");
}

printf("Who is using supply? %s\n", buffer);


if(strcmp(buffer, "A"))
{
aRounds++;
}


while(done != 1)
{
//WAIT loop until message CO is received from client
bzero(buffer,2);
n = read(newsockfd,buffer,2);

if (n < 0)
{
error("ERROR reading from socket");
}

printf("Done? %s\n", buffer);



if(strcmp(buffer, "CO"))
{
done = 1;
}
}

done = 0;
}

fclose(file_ptr);
n = write(newsockfd, "DN", 2);

客户端代码片段:

while(noSupplies != 1)
{
//RECEIVE MSG from server about supplies
bzero(buffer,2);
n = read(sockfd,buffer,2);

if (n < 0)
{
error("ERROR reading from socket");
}

printf("%s\n",buffer);

if(strcmp(buffer, "BC") == 0 || strcmp(buffer, "CB") == 0)
{
//SEND server msg that you are using supply

n = write(sockfd,"A", 1);
if (n < 0)
{
error("ERROR writing to socket");
}


printf("Client A has received components %s during round %d.\n", buffer, round);


n = write(sockfd,"CO", 2);
if (n < 0)
{
error("ERROR writing to socket");
}

}
else if(strcmp(buffer, "DN"))
{
noSupplies = 1;
}

round++;
}

我从服务器得到以下信息(在杀死之前):

BC
Who is smoking? A
Done smoking? CO

以及来自客户端的以下内容(在终止之前):

BC
Client A has received components BC during round 1.

然后从客户端杀死后..我从服务器得到以下信息:

BC
Who is using supply? A
Done? CO
Done?
CB
Who is using supply?
Done?
CB
Who is using supply?
Done?
BC
Broken pipe

有人明白我做错了什么吗? (寻找代码修复!)

仅供引用..我最终将更改服务器代码以处理监听多个客户端(TCP),但一次会遇到一个障碍,对吗? :S

谢谢!

最佳答案

不确定这是否是您的全部问题,但是

bzero(buffer, 2);
n = read(socket, buffer, 2);

...

printf("%s", buffer);

是不正确的,因为如果读取实际上获得了 2 个字节并且它们都不是 0,那么缓冲区可能不是一个以 null 结尾的字符串(除非之前有一些东西导致了这一点)。

strcmp 的多次调用也总是会因为同样的原因而失败 - 读取的字符串不是 0 终止的,因此 strcmp 认为它会继续进行,因此与比较的结果不同字符串,即使第一个字母相同。

编辑

 n = read(socket, buffer, 2);
if (n<0) {
die_horrible_death();
}
buffer[n] = 0; // since arrays are 0 indexed this should be after last read character
printf("I just read: \"%s\"\n", buffer);

关于c - TCP 连接的错误和意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3937280/

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