关于网友提出的“ 关于当sockfd发送缓冲区满,接受缓冲区也满以后的状态”问题疑问,本网通过在网上对“ 关于当sockfd发送缓冲区满,接受缓冲区也满以后的状态”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 关于当sockfd发送缓冲区满,接受缓冲区也满以后的状态
描述: 假设A,B两个主机,A向B发数据,B也同时向A发送数据。
如果两台主机同时遇到各自发送,接收缓冲区都满了,会不会两个主机一直阻塞??
我就遇到这样的情况,
两个主机一直在阻塞在“no socket ready for write within %d secs\n", SELECT_TIMEOUT);”也不知道是不是其他程序的问题。
求指导。
void // Write "n" bytes to a descriptor.
my_write(int fd, const void *vptr, long n)
{
setSockNonBlock(fd);
/*for select*/
fd_set writefds, writefdsBack;
struct timeval timeout;
int selectVal;
/*for select*/
FD_ZERO(&writefds);
FD_ZERO(&writefdsBack);
FD_SET(fd,&writefdsBack);
int maxfd=fd;
long nleft;
long nwritten;
const char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0)
{
timeout.tv_sec = SELECT_TIMEOUT;
timeout.tv_usec =0;
writefds=writefdsBack;
selectVal = select(maxfd+1,NULL,&writefds,NULL, &timeout);
if (selectVal==-1)
{
perror("select failed\n");
exit(EXIT_FAILURE);
}
if (selectVal == 0)
{
printf("no socket ready for write within %d secs\n", SELECT_TIMEOUT);
}
//检查每个socket,并进行读/写(如果是sock则accept)
if (selectVal >0)
{
if (FD_ISSET(fd, &writefds))
{
if ( (nwritten = write(fd, ptr, nleft)) <= 0)
{
if (nwritten < 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN))
{
nwritten = 0; // and call write() again
//printf("write nothing!\n");
}
else
{
printf("write error occured\n");
exit(0);
//return(-1); // error
}
}
nleft -= nwritten;
ptr += nwritten;
}
}
}
//return(n);
}
以上介绍了“ 关于当sockfd发送缓冲区满,接受缓冲区也满以后的状态”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2979581.html