当前位置: 技术问答>linux和unix
请教个问题sockfd select(顺序问题)..在线等.....急
来源: 互联网 发布时间:2016-07-14
本文导语: 如果服务器端给客户端发个信息过去"Ready",客户端收到"Ready"后给服务器回一个"ok". 服务器这边可以用select在一个端口上既接收又读取吗? if(FD_ISSET(sockfd,&readfds)) if(FD_ISSET(sockfd,&writefds)) 可以上面这样用吗? 如果可...
如果服务器端给客户端发个信息过去"Ready",客户端收到"Ready"后给服务器回一个"ok".
服务器这边可以用select在一个端口上既接收又读取吗?
if(FD_ISSET(sockfd,&readfds))
if(FD_ISSET(sockfd,&writefds))
可以上面这样用吗?
如果可以的话,对面回个"ok"过来的时候,服务器这边应该是FD_ISSET(sockfd,&readfds)和FD_ISSET(sockfd,&writefds)2个条件都成立吧?服务器这边读取和接收2个的顺序是同时的吗?
或者说根本就不可以这样用select?
服务器这边可以用select在一个端口上既接收又读取吗?
if(FD_ISSET(sockfd,&readfds))
if(FD_ISSET(sockfd,&writefds))
可以上面这样用吗?
如果可以的话,对面回个"ok"过来的时候,服务器这边应该是FD_ISSET(sockfd,&readfds)和FD_ISSET(sockfd,&writefds)2个条件都成立吧?服务器这边读取和接收2个的顺序是同时的吗?
或者说根本就不可以这样用select?
|
select(maxfd, &readfds, &writefds, NULL, &timeout);
if(FD_ISSET(sockfd, &readfds))
{
recv(sockfd, buffer, sizeof(buffer));
}
//reponse with "OK"
strcpy(buffer, "OK", 2);
if(FD_ISSET(sockfd, &writefds))
{
send(sockfd, buffer, sizeof(buffer));
}
if(FD_ISSET(sockfd, &readfds))
{
recv(sockfd, buffer, sizeof(buffer));
}
//reponse with "OK"
strcpy(buffer, "OK", 2);
if(FD_ISSET(sockfd, &writefds))
{
send(sockfd, buffer, sizeof(buffer));
}
|
一个端口上既接收又读取
//=======================
在这个接口上既发送又接受吧?哈哈
if(FD_ISSET(sockfd,&readfds))
if(FD_ISSET(sockfd,&writefds))
这样是可以的。
如果你发送完数据之后,一般两个条件是都成立。但是你此时必须得让程序去接受数据,这得靠你自己设计
所以,你可以依次用两个select
或者如果你用一个的话,其实需要写个循环,在写完数据之后,打标志,表示发送数据,需要接受,下一次即使if(FD_ISSET(sockfd,&writefds)) 为真,仍然不发送。
表达有些乱。
//=======================
在这个接口上既发送又接受吧?哈哈
if(FD_ISSET(sockfd,&readfds))
if(FD_ISSET(sockfd,&writefds))
这样是可以的。
如果你发送完数据之后,一般两个条件是都成立。但是你此时必须得让程序去接受数据,这得靠你自己设计
所以,你可以依次用两个select
或者如果你用一个的话,其实需要写个循环,在写完数据之后,打标志,表示发送数据,需要接受,下一次即使if(FD_ISSET(sockfd,&writefds)) 为真,仍然不发送。
表达有些乱。
|
不用两个、、、用select只检测那个读的套接字,然后用这个套接字接收,如果要应答客户端的话再用这个套接字写回去就行了!