当前位置: 技术问答>linux和unix
多线程内使用socket进行connect
来源: 互联网 发布时间:2016-06-16
本文导语: 我在进行多线程编程时候想用多个线程,每个线程建立一个client取连接不同IP的远程主机,如果没有接上,就sleep两秒,然后再去连接,发现一个奇怪的问题: 如果所有主机的server监听都不打开,这个时候所有的c...
我在进行多线程编程时候想用多个线程,每个线程建立一个client取连接不同IP的远程主机,如果没有接上,就sleep两秒,然后再去连接,发现一个奇怪的问题:
如果所有主机的server监听都不打开,这个时候所有的cilent都会每两秒调用一次connect,每个connect返回-1,当有一个主机的sever监听打开时,这个时候首先其中一个连接到该主机的connect会返回0,结束连接。按理说其他连接到不同主机的线程会继续connect自己要连接的主机,但发现每个线程在进行下一次循环的时候也全都返回0.(其实他们要连接的主机根本没开监听)这说明其中一个线程的connect返回值对其他线程的connect返回值造成了影响。
主线程->线程1->connect 192.168.6.100 返回-1重新连 返回-1重新连 ->远程主机开始监听 ->返回0->写数据退出
线程2->connect 192.168.6.101 返回-1重新连 返回-1重新连 返回-1重新连 返回0 写数据退出(当然是没有写成因为远程没开监听)
线程3->connect 192.168.6.102 返回-1重新连 返回-1重新连 返回-1重新连 返回0 写数据退出(当然是没有写成因为远程没开监听)
红色的显示了运行的异常,我试了多次,在循环connect中,只要有一个线程连接上返回0,其他立刻在下一轮connect时全返回0.代码如下,clientThread是每个线程,底下是调用该线程的函数。
说明: 绝对不是connect的地址共享了,我在每次connect的时候都打印该线程要连接的地址,没有问题。每个线程是连接到不同主机。socket是在每个不同线程内创建的。
void *ClientThread(void *arg)
{
int sockfd,numbytes;
thread_date* date = (thread_date*)arg;
const char* path = (date->path).c_str();
const char* ip = (date->ip).c_str();
printf("ClientThread is running. Argument was %sn",(date->ip).c_str());
/*****init socket to send*****/
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8008);
serv_addr.sin_addr.s_addr = inet_addr(ip);
bzero(&(serv_addr.sin_zero),8);
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
fprintf(stderr,"socket errorn");
pthread_exit(NULL);
}
int i;
for(i =0;i
如果所有主机的server监听都不打开,这个时候所有的cilent都会每两秒调用一次connect,每个connect返回-1,当有一个主机的sever监听打开时,这个时候首先其中一个连接到该主机的connect会返回0,结束连接。按理说其他连接到不同主机的线程会继续connect自己要连接的主机,但发现每个线程在进行下一次循环的时候也全都返回0.(其实他们要连接的主机根本没开监听)这说明其中一个线程的connect返回值对其他线程的connect返回值造成了影响。
主线程->线程1->connect 192.168.6.100 返回-1重新连 返回-1重新连 ->远程主机开始监听 ->返回0->写数据退出
线程2->connect 192.168.6.101 返回-1重新连 返回-1重新连 返回-1重新连 返回0 写数据退出(当然是没有写成因为远程没开监听)
线程3->connect 192.168.6.102 返回-1重新连 返回-1重新连 返回-1重新连 返回0 写数据退出(当然是没有写成因为远程没开监听)
红色的显示了运行的异常,我试了多次,在循环connect中,只要有一个线程连接上返回0,其他立刻在下一轮connect时全返回0.代码如下,clientThread是每个线程,底下是调用该线程的函数。
说明: 绝对不是connect的地址共享了,我在每次connect的时候都打印该线程要连接的地址,没有问题。每个线程是连接到不同主机。socket是在每个不同线程内创建的。
void *ClientThread(void *arg)
{
int sockfd,numbytes;
thread_date* date = (thread_date*)arg;
const char* path = (date->path).c_str();
const char* ip = (date->ip).c_str();
printf("ClientThread is running. Argument was %sn",(date->ip).c_str());
/*****init socket to send*****/
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8008);
serv_addr.sin_addr.s_addr = inet_addr(ip);
bzero(&(serv_addr.sin_zero),8);
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
fprintf(stderr,"socket errorn");
pthread_exit(NULL);
}
int i;
for(i =0;i