免费注册 查看新帖 |

Chinaunix

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

socket通讯时客户端bind端口问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-09 10:48 |只看该作者 |倒序浏览
客户端多个线程,每一个线程作为一个socket客户端,服务端通过请求的地址和端口判断是来自哪个线程的请求,原来这样可以实现,但是现在我将服务器端也改为多线程,每一个线程作为一个socket的服务端,现在总是只能连接上一个线程的socket,其余的总是说“地址已经被绑定”或“不能绑定制定的地址”,大家帮我看看什么原因吧!  谢谢!!!
我的客户端代码是:
memset((char*)&tcp_ser_addr, 0, sizeof(tcp_ser_addr));
    namelen = sizeof(loc_addr);
    memset((char*)&loc_addr, 0, namelen);
    tcp_ser_addr.sin_family=AF_INET;
    if(service!=NULL)
    {
        sp = getservbyname(service,"tcp";
        if(sp == NULL)
        {
            fprintf(stderr,"getservbyname: %s\n",strerror(errno));
            return(-1);
        }
        tcp_serv_info = *sp;
        if(port>0)
            tcp_ser_addr.sin_port=htons(port);    /*caller's port */
        else
            tcp_ser_addr.sin_port=sp->s_port;      /*service value*/
    }else
    {
        if(port<=0)
        {
            return(-1);
        }
        tcp_ser_addr.sin_port=htons(port);           /*caller's value*/
    }
    inaddr=inet_addr(host);
    if(inaddr!=INADDR_NONE)
    {           memcpy((char*)&tcp_ser_addr.sin_addr,(char*)&inaddr,sizeof(inaddr));
    }
    else
    {  
        hp=gethostbyname(host);
        if(hp==NULL)
        {
            fprintf(stderr,"gethostbyname: %s\n",strerror(errno));
            return(-1);
        }
        tcp_host_info=*hp;
        memcpy((char*)&tcp_ser_addr.sin_addr,(char*)hp->h_addr,hp->h_length);
    }
    inaddr=inet_addr(local);
    if(inaddr!=INADDR_NONE)
    {
        memcpy((char*)&loc_addr.sin_addr,(char*)&inaddr,sizeof(inaddr));
    }
    loc_addr.sin_port=htons(local_port);    /*caller's port */
    fd=socket(AF_INET,SOCK_STREAM,0);   //debug AF-> PF
    if(fd<0)
    {
        fprintf(stderr,"fe_tcp_open:tcp_socket: %s:%d\n",strerror(errno),errno);
        if(errno ==24)   return (88;     //tcp_socket: Too many open files:24
        return(-1);
    }

    #if (defined(_HPUX_))
    if( bind(fd,&loc_addr,sizeof(loc_addr)) < 0 )
    #else
    if( bind(fd,(struct sockaddr*)&loc_addr,sizeof(loc_addr)) < 0 )
    #endif
    {
        fprintf(stderr,"tcp_bind: %s\n",strerror(errno));
    }

    settcpattr(fd);

    /*
     *  Connect the client to a specified server.
     */
    #if (defined(_HPUX_))
    if(connect(fd,&tcp_ser_addr,sizeof(tcp_ser_addr))<0)
    #else
    if(connect(fd,(struct sockaddr*)&tcp_ser_addr,sizeof(tcp_ser_addr))<0)
    #endif
    {
        close(fd);
        return(-1);
    }
    #if (defined(_HPUX_))
    getsockname(fd, &loc_addr, &namelen);
    #else
    getsockname(fd, (struct sockaddr *)&loc_addr, &namelen);
    #endif

论坛徽章:
0
2 [报告]
发表于 2007-08-09 10:57 |只看该作者
man setsockopt

论坛徽章:
0
3 [报告]
发表于 2007-08-09 14:20 |只看该作者
你服务端怎么设计的!
你多个线程,是不是每个线程都绑定了一下端口号!?
那样会出问题的!

论坛徽章:
0
4 [报告]
发表于 2007-08-09 16:50 |只看该作者
客户端程序一般不需要绑定端口

论坛徽章:
0
5 [报告]
发表于 2007-08-10 08:41 |只看该作者
这个貌似服务器端的每个线程只对你listen生成的data socket进行接发操作哦.....

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2007-08-10 08:45 |只看该作者
这是在学习呢?
还是在工作?
如果是后者,那这样的水平写出来的程序质量有保障吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP