gpt4 book ai didi

c - 选择()没有响应?

转载 作者:太空宇宙 更新时间:2023-11-04 01:35:50 27 4
gpt4 key购买 nike

我的程序的目标是使用 select 来管理多个套接字。但是,我想先用一个 socket 试试。现在,我面临的问题是,最初客户端向服务器发送数据,服务器接收并显示它,但是当客户端再次发送一些数据时,服务器代码仍然停留在 select 命令。

这里有一些片段可以让您了解我是如何初始化套接字的。

if((master_socket = socket(PF_INET, SOCK_STREAM, 0)) < 0)
{
exit(1);
}

if((bind(master_socket, (struct sockaddr *)&req, sizeof(req))) < 0)
{
exit(1);
}

listen(master_socket, 5);
FD_SET(master_socket,&listening);

/* wait for connection, then receive and print text */
len = sizeof(struct sockaddr);
while(1)
{
FD_ZERO(&listening); //Flush out everything in socket
FD_SET(master_socket,&listening); // Add master
if(f_client>0) // Add client if any
{
FD_SET(f_client,&listening);
}
printf("Checking for new connection \n");
//Timeout is null, so waiting indefinitely
rc = select(FD_SETSIZE, &listening, NULL, NULL, NULL);

if (FD_ISSET(master_socket, &listening))
{
printf("Master side invoked\n");
if((f_client = accept(master_socket, (struct sockaddr *)&req, &len)) < 0)
{
exit(1);
}
}

else if (FD_ISSET(f_client,&listening))
{
if ((valread = read( f_client , buf, 1024)) == 0)
{
close(f_client);
f_client=0;
}
else
{
fputs(buf, stdout);
}

}

基本上在上面的程序中,它连接到服务器,为客户端 f_client 维护一个文件描述符并添加它。并且在每一轮中,它都会清除套接字,添加主套接字和客户端套接字(如果有),然后进行检查。这里的问题是,第一次有效,但第二次是客户端发送一些数据。它会挂到 rc = select(FD_SETSIZE, &listening, NULL, NULL, NULL);

我不明白这里有什么问题。谁能帮忙?

最佳答案

     if ((valread = read( f_client , buf, 1024)) == 0)
{
close(f_client);
f_client=0;
}
else
{
fputs(buf, stdout);
}

此代码已损坏。 fputs 函数只能与 C 风格的字符串一起使用。您只是拥有没有特定结构的任意数据。由于您忽略了 valread,因此您也不知道读取了多少字节。 (想一想,fputs 怎么可能知道要输出多少字节?那个信息只在valread 里,你不把那个信息传给它。)

您已经收到数据,这个损坏的代码只是把它扔掉了。如果您记录 valread,您会发现在挂起的 select 调用之前,您实际上已经在最后一次调用 read 时读取了它。

代替fputs,你可以使用这样的东西:

for (int i = 0; i < valread; ++i)
putchar(buf[i]);

关于c - 选择()没有响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14552346/

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