您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> 关于当sockfd发送缓冲区满,接受缓冲区也满以后的状态

关于当sockfd发送缓冲区满,接受缓冲区也满以后的状态

来源:网络整理     时间:2016/7/28 4:44:16     关键词:

关于网友提出的“ 关于当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

相关图片

相关文章