免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1543 | 回复: 1
打印 上一主题 下一主题

[网络] TCP客户端连接服务器的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-02 01:04 |只看该作者 |倒序浏览
代码中监听请求连接的队列长度是1,但当同时开启5 6 个客户端时, 有一个连接成功, 其他的都在阻塞状态(connect函数返回0,send发送数据也可以成功). 当断掉连接着的客户端时,第二个请求的客户端会连接成功,然后依次第三 第四...
我不明白的是, 这里为什么第三个和之后的客户端的connect函数会返回0? 在请求消息数量达到消息队列的最大值时,不应该被refuse么?为什么还在阻塞状态?

代码如下(MAXCLIENT为1)

client关键代码:
void connectServer(){

sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd) { perror("创建socket失败\n"; return;  }

struct sockaddr_in server_addr;

server_addr.sin_family      = AF_INET;
server_addr.sin_port        = htons(3000);
server_addr.sin_addr.s_addr = inet_addr("172.30.9.138";
bzero(&(server_addr.sin_zero),;

int con =  connect(sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr));
printf("connection:%d\n",con);
if(-1 == con) { perror("连接错误"; exit(-1);  }

printf("连接成功!\n";
}

server关键代码:

void initServer(){

sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd)
   perror("鍒涘缓socket澶辫触锛乗n";

struct sockaddr_in my_addr;

my_addr.sin_family      = AF_INET;
my_addr.sin_port        = htons(3000);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),;

if(-1 == bind(sockfd,(struct sockaddr *)&my_addr,sizeof(my_addr)))
   perror("绑定失败\n";
if(-1 == listen(sockfd,MAXCLIENT))
   perror("监听失败\n";
}

void acceptConn(){
int accept_num = 0;
int temp;



struct sockaddr_in their_addr;
int size_addr = sizeof(their_addr);

  while(1){

      if(client_id >= MAXCLIENT)
          client_id = 0;

      if(client_num < MAXCLIENT){
         temp = accept(sockfd,(struct sockaddr *)&their_addr,&size_addr);
      if(temp == -1){
         printf("连接失败!\n",client_id);
         continue;
      }else{
         ClientInfo clientInfo;
         
         clientInfo.flag = 1;
         clientInfo.socket = temp;
         clientInfo.client_addr = their_addr;
        
         while(client[client_id].flag == 1){
              client_id++;
              if(client_id >= MAXCLIENT)
                 client_id = 0;
         }     
         client[client_id] = clientInfo;
      }
     
      if(!pthread_create(&client[client_id].pthread_id,NULL,server,&client[client_id].socket)){                       
         printf("创建线程成功\n",client_id);
         client_id++;
         client_num++;
        printf("client_id:%d\n",client_id);
        printf("client_num:%d\n",client_num);
      }
      else
         printf("创建线程失败!\n";
    }  }
      
}

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-02-02 13:57 |只看该作者
会重试的...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP