gpt4 book ai didi

c - 当数据从套接字传入时如何将数据打印到终端

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

我正在编写一个 IRC 机器人(仍然),并且我已经在这里被难住了好几个月了。我编写了这个函数来接收数据并将其打印出来,简单的东西,但它并不总是有效。例如,当机器人连接到服务器时,服务器会发送 MoTD,当此函数尝试将其打印出来时,通常会在最后截掉几行。

int mainLoop(int socketDescriptor)
{
int bytesReceived = 0, i;
char workingBuffer[RECVBUFF];

do
{
for (i = 0; i < RECVBUFF; i += bytesReceived)
{
bytesReceived = recv(
socketDescriptor,
workingBuffer + i,
RECVBUFF - i,
0);
}

for (i = 0; i < RECVBUFF; ++i)
printf("%c", workingBuffer[i]);
}
while(1);

return 0;
}

下面是一些屏幕截图,显示了我的程序的输出以及像 irssi 这样的客户端的输出。

My program's output Irssi's output

正如你所看到的,我的程序只是在最后一个 block 上停止并停止打印。我该如何解决这个问题?

最佳答案

您的第一个for除非缓冲区已满,否则循环永远不会退出。响应的最后部分不太可能完全填充缓冲区。 这样的东西可能会有所帮助:

for (i = 0; i < RECVBUFF; i += bytesReceived)
{
bytesReceived = recv(
socketDescriptor,
workingBuffer + i,
RECVBUFF - i,
0);

if (!bytesReceived)
break;
}

或者:

bytesReceived = 1; /* so the loop does at least one iteration */

for (i = 0; i < RECVBUFF && bytesReceived; i += bytesReceived)
{
bytesReceived = recv(
socketDescriptor,
workingBuffer + i,
RECVBUFF - i,
0);
}

<罢工>

好的,新计划——最简单(可能不是最好)的解决方案:

int mainLoop(int socketDescriptor)
{
int bytesReceived = 0, i;
char workingBuffer[RECVBUFF];

do
{
bytesReceived = recv(
socketDescriptor,
workingBuffer,
RECVBUFF,
0);

for (i = 0; i < bytesReceived; ++i)
printf("%c", workingBuffer[i]);
}
while(bytesReceived);

return 0;
}

关于c - 当数据从套接字传入时如何将数据打印到终端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24621568/

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