当前位置:  技术问答>linux和unix

accept函数的阻塞问题

    来源: 互联网  发布时间:2016-05-13

    本文导语:  各位,小弟刚刚接触了linux下的网络编程中的线程编程,最近编写了一个C/S简单模型程序,却始终实现不了功能: client.c主函数如下: int main(int argc,char **argv) {   int sockfd;   struct sockaddr_in servaddr;   pthread_t tid...

各位,小弟刚刚接触了linux下的网络编程中的线程编程,最近编写了一个C/S简单模型程序,却始终实现不了功能:
client.c主函数如下:
int main(int argc,char **argv)
{
  int sockfd;
  struct sockaddr_in servaddr;
  pthread_t tid;
  int ret;
  if(argc!=2)
    {
       printf("usage:tcpcli";
       exit(0);
    }
  //printf("1n";
  bzero(&servaddr,sizeof(servaddr));
  servaddr.sin_family=AF_INET;
  servaddr.sin_port=htons(SERV_PORT);
  inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
  connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
  //printf("2n";
  str_cli(stdin,sockfd);
  exit(0);
}
server.c主函数如下:
int main(int argc,char **argv)
{
  int listenfd,connfd;
  socklen_t addrlen,len;
  struct sockaddr_in cliaddr,servaddr;
  pthread_t tid;
  int i;
  listenfd=socket(AF_INET,SOCK_STREAM,0);
  bzero(&servaddr,sizeof(servaddr));
  servaddr.sin_family=AF_INET;
  servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  servaddr.sin_port=SERV_PORT;
  i=bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
  if(i!=0)
    {
      printf("bind error!n";
      return;
    }
  
  listen(listenfd,20);
  addrlen=sizeof(cliaddr);
  bzero(&cliaddr,sizeof(cliaddr));
  for(;
     {
      len=addrlen;
      printf("1n";
      connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&addrlen);
      // if(connfd==INVALID_SOCKET)
      //{
      //  break;
      //}
      printf("2n";
      pthread_create(&tid,NULL,&doit,(void *)connfd);
      pthread_join(tid,NULL);
      }
}
在客户端的命令如下:./client 127.0.0.1(本机内部循环测试),但是用printf测试发现server主函数会一直阻塞在accept函数中,即使在客户端的 connect已经成功返回的情况下,accept也是会阻塞。在最后一次握手不是客户端接受到服务器的同步信号并且回应就可以建立连接吗?连 connect都成功返回了,应该accpet就可以收到一个连接序列了吧?为什么会一直被阻塞呢?

|
子线程里是怎么处理的?会不会立刻退出?如果不会,那pthread_join就阻赛了。

你connect成功了的话,accept一般都会成功的,除非服务器没有收到最后一个握手消息,不过这个机率非常的小。

|
 connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); 
// 加个延时或先send一下再延时

|
printf("2n");

改成fprintf(stderr, "2n");

标准输出是带缓冲的 不适合调试测序的时候输出日志 

    
 
 

您可能感兴趣的文章:

  • 如何能够同时监听多个端口而又不被accept()阻塞?
  • 关于《Unix网络编程》在ubuntu 8.04下运行的问题,服务器端阻塞在accept调用,客户端阻塞在connect调用,导致连接失败
  • accept阻塞问题
  • 如何中断阻塞方式accept调用
  • 关于accept阻塞和alarm闹钟问题
  • 请教一个网络编程问题,accept函数的,在线等,急。。。
  • accept函数为何返回0???
  • 请教LINUX 中 服务端 accept 函数
  • 在sockets中的Connect()/Accept()这样的包裹函数
  • accept函数的问题
  • java 中 SOCKET 的ACCEPT函数有返回值吗?怎样返回才是正常的?
  • linux网络编程里面,accept(listen_fd,NULL,NULL)函数的地址参数为NULL是什么意思?
  • Linux 中c网络编程,accept函数的问题,请大家指点,谢谢
  • 使用socket的accept()函数时Interrupted system call问题
  • 关于accept()函数能产生多少个套接字和在LINUX 能产生多少个线程
  • 关于accept函数的一点迷惑!
  • 调用ACE_SSL_SOCK_Acceptor::accept函数的时候,进程死掉(在一个死循环中不断的调用accept,程序运行一段时间后,就会死掉)
  • 小白请教关于Listen、accept、信号处理函数、waitpid的几个问题
  • socket 编程中的 Accept函数问题
  • 帮忙看下socket中的accept函数的问题(只剩30分了,大家别嫌少哈)
  • accept函数没有返回
  • 通过accept函数得到的端口不正确!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • socket accept问题,大家指教。
  • 初学socket,求教关于listen和accept关系的问题。
  • 新手请教一个select accept 问题 ?
  • 一个关于accept()的问题。
  • openssl的ssl_accept丢包问题
  • configure: error: no acceptable C compiler found in $PATH 什么问题啊?
  • linux socket编程 accept 返回值的问题
  • close掉socket后,在accept了1024次后,出现打开文件最大限制1024的问题
  • (菜鸟飞飞) accept后创建的socket描述符问题
  • linux socket 中 accept() 问题
  • java命名空间java.net类httpurlconnection的类成员方法: http_accepted定义及介绍
  • Accept() 返回0,请问是怎么回事 ?
  • java命名空间java.awt.event类keyevent的类成员方法: vk_accept定义及介绍
  • iptables的默认策略与accept的疑问
  • java命名空间java.net类httpurlconnection的类成员方法: http_not_acceptable定义及介绍
  • accept的多线程在这里是如何体现的?
  • java命名空间javax.swing类jfilechooser的类成员方法: accept定义及介绍
  • accept返回-1的原因
  • java命名空间java.net接口cookiepolicy的类成员方法: accept_none定义及介绍
  • 为何我close了 accept不立即返回
  • java命名空间java.net接口cookiepolicy的类成员方法: accept_all定义及介绍
  • socket编程select对accept的影响
  • java命名空间java.net类socketimpl的类成员方法: accept定义及介绍
  • 用accept系统调用得到的socket能用在readv和writev上吗?
  • java命名空间javax.xml.stream接口eventfilter成员方法: accept定义参考
  • accept,recvfrom接收到奇怪的ip
  • java命名空间java.io接口filefilter的类成员方法: accept定义及介绍
  • 在linux安装gcc的时候报:configure:no acceptable cc found in $PATH
  • java命名空间javax.xml.stream接口streamfilter成员方法: accept定义参考
  • 为什么SSL_accept总是返回失败?
  • java命名空间java.io接口filenamefilter的类成员方法: accept定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3