免费注册 查看新帖 |

Chinaunix

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

[C++] TCP多client连接调试异常,请高手帮助,谢谢 ! [复制链接]

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-16 00:24 |只看该作者 |倒序浏览
本帖最后由 mini_peng 于 2015-02-16 00:28 编辑

写的TCP监听程序,单个用户连接时,一切正常。两个及以上TCP  Client连接上时,只有第一个有反应。
于是baidu,有fcntl和select的方法。调试时发现只能接收client发来的第一个串,然后就不再响应。
何故??
(这是网上的例程,我copy来调试时也未通过,只能接收client的第一个串)
//---------------------------------------------
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/un.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>

#define SERVPORT 333
#define BACKLOG 10
#define MAX_CONNECTED_NO 10
#define MAXDATASIZE 100

int main()
{
       
    socklen_t sock_len,*sin_size;
    size_t recvbytes;
   
    struct sockaddr_in server_sockaddr,client_sockaddr;
        int flags;
        int sockfd,client_fd;
        char buf[MAXDATASIZE];
   
    sock_len = sizeof(struct sockaddr);
    sin_size = &sock_len;
   
    /*创建socket*/
        if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
    //if((sockfd = socket(AF_UNIX,SOCK_STREAM,0))==-1)
    //if((sockfd = socket(AF_LOCAL,SOCK_STREAM,0))==-1)
   
    {
                perror("socket");
                exit(1);
        }
        printf("socket success!,sockfd=%d\n",sockfd);
   
    /*设置sockaddr结构*/
        server_sockaddr.sin_family=AF_INET;
    //server_sockaddr.sin_family=AF_UNIX;
        server_sockaddr.sin_port=htons(SERVPORT);
        server_sockaddr.sin_addr.s_addr=INADDR_ANY;
        bzero(&(server_sockaddr.sin_zero),8);
   
    /*将本地ip地址绑定端口号*/
        if(::bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1){
                perror("bind");
                exit(1);
        }
        printf("bind success!\n");
   
    /*监听*/
        if(listen(sockfd,BACKLOG)==-1){
                perror("listen");
                exit(1);
        }
        printf("listening....\n");
   
    /*fcntl()函数,处理多路复用I/O*/
        if((flags=fcntl( sockfd, F_SETFL, 0))<0)
        perror("fcntl F_SETFL");
    //flags |= O_NONBLOCK;
    flags |= O_ASYNC;
    if(fcntl( sockfd, F_SETFL,flags)<0)
        perror("fcntl");
   
        while(1)
    {
                //sin_size=sizeof(struct sockaddr_in);
        //sock_len = sizeof(struct sockaddr_in);
        //sin_size = &sock_len;
        
                if((client_fd=accept(sockfd,(struct sockaddr*)&client_sockaddr,sin_size))==-1)
        {  //服务器接受客户端的请求,返回一个新的文件描述符
                        perror("accept");
                        exit(1);
                }
                if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1){
                        perror("recv");
                        exit(1);
                }
                if(read(client_fd,buf,MAXDATASIZE)<0){
                        perror("read");
                        exit(1);
                }
                printf("received a connection :%s",buf);
        
        /*关闭连接*/
        //close(client_fd);
        //exit(1);
        }/*while*/
   
}

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2015-02-16 08:45 |只看该作者
第二次循环你的程序应该阻塞在accept了,没有recv

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
3 [报告]
发表于 2015-02-16 09:31 |只看该作者
回复 2# hellioncu

我step时,只见buf有一次值,可能就是你说的这情况。
我应accept置为 非阻塞模式?


   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2015-02-16 09:36 |只看该作者
mini_peng 发表于 2015-02-16 09:31
回复 2# hellioncu

我step时,只见buf有一次值,可能就是你说的这情况。


用最基本的select模型,找本书或者网上找点文章看看,好过你这么瞎折腾
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP