在写一个程序可以进行ping和trace,程序中ping和trace分别使用一个线程实现,现在遇到一个问题,比如同时ping 和trace 百度时,ping和trace接收的包就有问题,而这两个线程单独进行时就正常,程序框架如下:ping:(m_hSocket是在线程内创建的局部变量)
m_hSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
setsockopt设置超时缓冲区等属性
创建ICMP报文
sendto(m_hSocket, m_pIcmpData, m_nDataSize, 0, (struct sockaddr *)&m_addrDest, sizeof(m_addrDest));
recvfrom(m_hSocket, m_pRecvBuf, MAX_PACKET, 0, (struct sockaddr *)&m_addrFrom, &fromlen);
解析报文trace和ping类似,只是在sendto之前对报文设置了TTL值每发一次从1开始增加。
setsockopt(m_hSocket, IPPROTO_IP, IP_TTL, (char*)&m_TTL, sizeof(m_TTL));跪求指点!

解决方案 »

  1.   

    仅供参考:#include <windows.h>
    #include <stdio.h>
    #include <string.h>
    char YN(int k) {
        FILE *f;
        char fn[40];
        char ln[80];
        char yn;
        int n;    yn='N';
        sprintf(fn,"d:\\ping%d.txt",k);
        f=fopen(fn,"r");
        if (NULL!=f) {
            n=0;
            while (1) {
                if (NULL==fgets(ln,80,f)) break;//
                if (strstr(ln,"ms ")) {
                    yn='Y';
                    break;//
                }
                n++;
                if (n>=4) break;//
            }
            fclose(f);
        }
        return yn;
    }
    void main(int argc,char **argv) {
        char cmdstr[256];
        int i;
        int IP[3];
        char c;    if (argc<2) {
        USAGE:
            printf("Usage example:\n    %s 192.168.60.\nto test 192.168.60.1-254\n",argv[0]);
            return;
        }
        if (4==sscanf(argv[1],"%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&c)) {
            if (0<=IP[0] && IP[0]<=255
             && 0<=IP[1] && IP[1]<=255
             && 0<=IP[2] && IP[2]<=255
             && '.'==c) {
                for (i=1;i<255;i++) {
                    sprintf(cmdstr,"cmd /c ping %s%d -n 1 -w 1000 >d:\\ping%d.txt",argv[1],i,i);
                    WinExec(cmdstr,SW_HIDE);
                }
                Sleep(3000);
                for (i=1;i<255;i++) {
                    printf("%c %s%d\n",YN(i),argv[1],i);
                }
                Sleep(3000);
                WinExec("cmd /c del /q d:\\ping*.txt",SW_HIDE);
            } else goto USAGE;
        } else goto USAGE;
    }
      

  2.   

    2个线程之间没有共用的变量,今天还发现,如果同时开2个线程同时ping 百度,结果也是错的,在SOCKET通信时如何能保证A线程里socket 发送的ping百度包,能被A线程接收,而不被B线程接收??