使用select等待客户端套接字上的数据
你知道为什么当服务器在客户端等待select时写入套接字,select永远不会完成吗 我使用c在套接字之间进行通信。我的客户端与服务器连接良好使用select等待客户端套接字上的数据,c,sockets,select,C,Sockets,Select,你知道为什么当服务器在客户端等待select时写入套接字,select永远不会完成吗 我使用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; clien
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_集合,我可以强制它从套接字读取,但select似乎不会从套接字读取数据中触发
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
你能试试看它是否管用吗
只有当你按下键盘上的一个键时它才会出现的原因是因为stdin是0,这将在0-(3-1)范围内,这是被检查的。如果将第一个参数设置为socket_desc+1,则应检查0-(socket_desc)范围是否为就绪套接字另外,在多个套接字上进行选择时,应检查是否使用FD_ISSETyeah设置了套接字id。我觉得自己很笨。FD_ISSET是下一个。