日期:2014-05-16  浏览次数:20591 次

多线程中调用sendto,线程数一多起来,出现 bad file descriptor
在使用多线程调用函数sendto进行无连接的发包时,两三个线程可以正常跑,但是线程数一多,就出现了
sendto: Bad file descriptor
线程函数中的部分代码如下:
    pingsock = socket(AF_INET, SOCK_RAW, 1);
    if (pingsock < 0) {
        printf("the skt is %d\n", skt);
        return NULL;
    }
    setsockopt(pingsock, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeo(int));
    c = sendto(pingsock, packet, sizeof(packet), 0, (struct sockaddr *)&pingaddr[index], sizeof(struct sockaddr_in));
    if (c < 0) {
        perror(" sendto: ");
        close(pingsock);
        return NULL;
    }

是不是一个socket只能由一个线程使用,这里要多个线程的话,得开多个socket,一个线程用一个?还是说有其他问题呢?

------解决方案--------------------
当然了,并发socket除非这个socket是udp>
------解决方案--------------------
你只开 socket 不关 socket 当然有问题了. 
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

当然了,并发socket除非这个socket是udp>

谢谢指导,我刚刚也试了试一个线程用一个socket的方法,虽然解决了sendto的问题,但是引入了新问题,比如指定要发sendto5个icmp报文,结果发了一百多个duplicate 报文后,才发送完毕,这该怎么办哦[/quote讲错了,是接受到了100多个duplicate报文,每个线程都是ping 的不同ip地址的


多个Thread 调用同一个 socket ,你注意同步了吗?