网络测试小程序,接收老出错,求指导端口有关问题

网络测试小程序,接收老出错,求指导端口问题
写了一个网络测试的小程序,创建了两个进程A、B,同时用udp协议对两个不同主机发送icmp数据包,但是运行后发现,两个主机回复的数据包会出现接收混乱的现象,即回复给A进程的数据包被B进程的recvfrom给收过去了,或者反过来。
于是,我想如果用bind()函数给本地A、B两个进程指定不同的通信端口(这里我还没确定这个bind是指定了我这边的发送端口还是接收端口,或者是两者一起指定了。。。汗,自己觉得应该是一起指定了吧,水平实在有限,望指教),希望能够消除误收的现象;不过遗憾的是并没像想象的那样开始正常接收。
我想请教的是:问题解决不了,是我没有正确地指定端口呢,还是依旧漏掉了什么步骤?还是说指定端口这个思路根本不能解决我遇到的问题?
如果这个思路可以解决问题的话,希望高手不吝赐教,指点下哈!

下面是部分代码:

WSADATA wsadata;
if(WSAStartup(MAKEWORD(2,1),&wsadata)!=0)
{
cerr<<"Fail to find winsock2.1 or better!"<<endl;
return 1;
}
SOCKET socket;
socket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);
if (socket == INVALID_SOCKET) 

cout<<"WSASocket() failed:"<<GetLastError();
cout<<endl;
return -1;
}

sockaddr_in source,dest;
int sourcelen=sizeof(source);

get_task_info(destinfo,starttime,endtime,Datasize,filepath);//获取任务信息:地址,开始时间、结束时间等
memset(destinfo,NULL,32);
if(severnum==0)
destinfo="127.0.0.1";
else if(severnum==1)
destinfo="www.sina.com";
if(atoi(Datasize)!=0)
datasize=atoi(Datasize);
packetsize=datasize+sizeof(ICMPHEAD);
  sendbuf=new char[packetsize];

if (sendbuf == 0) 
{
cerr << "failed to allocate send buffer." << endl; 
return -1;
}
icmpdatapart=sendbuf+sizeof(ICMPHEAD);
recvbuf=new char[max_ip_packet_size];

if (recvbuf == 0) 
{
cerr << "failed to allocate recv buffer." << endl; 
return -1;
}

build_icmp_packet(sendbuf,datasize,icmpdatapart);//初始化icmp包

unsigned int addr = inet_addr(destinfo); 
if (addr !=INADDR_NONE) 

dest.sin_addr.s_addr = inet_addr(destinfo); 
dest.sin_family = AF_INET;

else 

hostent* hp = gethostbyname(destinfo); 
if (hp != 0) 


memcpy(&(dest.sin_addr), hp->h_addr, hp->h_length);
dest.sin_family = AF_INET;

else 

cerr << "failed to resolve " << destinfo << endl; 
return -1; 


if(severnum==0)
dest.sin_port=htons(25555);//随意指定了一个端口
else if(severnum==1)
dest.sin_port=htons(26666);//同上,随意指定了一个端口
bind(socket,(LPSOCKADDR)&dest,sizeof(dest));

bread=recvfrom(socket,recvbuf,max_ip_packet_size,0,(sockaddr *)&source,&sourcelen);

------解决方案--------------------
n久没有写过socket程序了
楼主可以仔细看看别人的例程,看看帮助,知道你用的这些函数分别起的是什么作用
发和收都可以bind,socket无非是端口+IP的匹配,recvfrom和sendto的函数的几个参数其实都已经很清晰表明了该怎么弄

收的时候必须bind,不然不知道接收哪个端口收过来的数据
发的时候可以也可以不bind,系统会为你自动指定一个端口,如果要固定端口发送,或者多网卡情况下固定一个IP地址发送,则就需要bind


最后楼主的代码好生涩,也没发全吧.既然是接收用recvfrom函数,那dest不就是自己吗,总归要绑定自己本机的其中一个地址吧,而source地址代码中没指定,总归要初始化个吧

象楼主说的这种发串的情况,把以上几个基本概念,基本函数搞清楚,就不会弄乱的
------解决方案--------------------
回4L:
还是没能明白您要表达的意思。
UDP的协议本身就比较麻烦,不熟悉用起来会有很多奇怪的现象。
您说的是两个线程接收的数据不一样?
如果是这样,那么一个线程最好监视一个端口,这样会容易理解一些。