gpt4 book ai didi

c - 使用 select 等待客户端套接字上的数据

转载 作者:太空狗 更新时间:2023-10-29 17:21:47 24 4
gpt4 key购买 nike

知道为什么当服务器在客户端等待选择时写入套接字时,选择永远不会完成吗?

我正在使用 c 在套接字之间进行通信。我的客户端连接到我的服务器正常。

socket_desc=socket(AF_INET,SOCK_STREAM,0);//create the socket descriptor
client->address.sin_addr.s_addr = inet_addr(ipAddress);
client->address.sin_family = AF_INET;
client->address.sin_port = htons(port);

bind(socket_desc,&address,sizeof(address));
connect(socket_desc, &address, sizeof(address));

当我使用 recv 来阻塞和监听数据时,一切正常:

int bytesRead = 1;
while(bytesRead){
int bufsize=1024;
char *buffer=malloc(bufsize);
bytesRead = recv(socket_desc, buffer, bufsize, 0);
printf("CLIENT RECV: %s", buffer);
}

如果我尝试使用 select,它似乎没有读取任何数据。如果我将 STDIN 添加到 fd_set,我可以强制它从套接字读取,但选择似乎不会从 socket_desc 读取数据中触发...?

int running = 1;
while(running){
/* wait for something to happen on the socket */
struct timeval selTimeout;
selTimeout.tv_sec = 2; /* timeout (secs.) */
selTimeout.tv_usec = 0; /* 0 microseconds */
fd_set readSet;
FD_ZERO(&readSet);
FD_SET(STDIN_FILENO, &readSet);//stdin manually trigger reading
FD_SET(socket_desc, &readSet);//tcp socket

int numReady = select(3, &readSet, NULL, NULL, &selTimeout);
//IT ONLY GETS PAST SELECT ON RETURN FROM THE KEYBOARD
if(numReady > 0){
char buffer[100] = {'\0'};
int bytesRead = read(socket_desc, &buffer, sizeof(buffer));
printf("bytesRead %i : %s", bytesRead, buffer);
if(bytesRead == 0){
running = FALSE;
printf("Shutdowning client.\n");

}
}

最佳答案

要选择的第一个参数应该是最大套接字 ID 加 1。因此在您的情况下,它应该是

socket_desc+1

你能试试看它是否有效吗?

它仅在您按下键盘上的某个键时出现的原因是因为标准输入为 0,这将在 0 - (3 - 1) 范围内,这是已检查的内容。如果将第一个参数设置为 socket_desc+1,则应检查 0 - (socket_desc) 范围内的就绪套接字

关于c - 使用 select 等待客户端套接字上的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4789377/

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