- 论坛徽章:
- 0
|
客户端多个线程,每一个线程作为一个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 |
|