在寫一個程式可以進行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));
跪求指點!
uj5u.com熱心網友回復:
僅供參考:#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;
}
uj5u.com熱心網友回復:
兩個執行緒是否之間有共享的資料等,導致接收的資料包亂了uj5u.com熱心網友回復:
2個執行緒之間沒有共用的變數,今天還發現,如果同時開2個執行緒同時ping 百度,結果也是錯的,在SOCKET通信時如何能保證A執行緒里socket 發送的ping百度包,能被A執行緒接收,而不被B執行緒接收??轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/127704.html
標籤:網絡編程
上一篇:MFC動態分割視窗
