关于udp的三次握手实现,该如何处理
关于udp的三次握手实现
小弟想用c++实现udp协议的三次握手过程,现在出现了一些问题,在第三次握手的时候,即客户端校验客户端回复的ack以及服务器端的随机数时,recvfrom的返回值正确,但是ShakingMessage3里面的东西却读不出来,请大侠们帮帮忙。谢谢。
服务器端:
客户端:
------解决方案--------------------
#progma pack (1)
google下就知道了,
既然收到了,你这个问题要不就是字节对齐问题,要不就是你自己的代码逻辑出现了问题,
udp有最大包限制,你这个程序估计也碰不到。
仔细检查发送端发的内容是不是你想发的。
小弟想用c++实现udp协议的三次握手过程,现在出现了一些问题,在第三次握手的时候,即客户端校验客户端回复的ack以及服务器端的随机数时,recvfrom的返回值正确,但是ShakingMessage3里面的东西却读不出来,请大侠们帮帮忙。谢谢。
服务器端:
bool UdpStart::ShakeHands()
{
CCSDef::TMSG_HEADER *pMesgHeader=NULL;
CCSDef::TMSG_SHAKINGHANDS ShakingMessage; //mine shakinmessage ,firstnumer is client random, secondnumber is server random
int firstnumber=random();
cout<<"random"<<endl;
ShakingMessage.SecondNumber=firstnumber;
SOCKADDR_IN from;
char buffer[1024]="\0";
int fromlen=sizeof(from);
printf("waiting for message from others-------------\n");
if (recvfrom(s,buffer,sizeof(buffer) ,0,(LPSOCKADDR)&from,&fromlen)!=SOCKET_ERROR)
{
printf("received datagram from %s--%s\n",inet_ntoa(from.sin_addr),buffer);
}
pMesgHeader=(CCSDef::TMSG_HEADER*)buffer;
CCSDef::TMSG_SHAKINGHANDS *ShakingMessage2=(CCSDef::TMSG_SHAKINGHANDS*)pMesgHeader;
ShakingMessage.FirstNumber=ShakingMessage2->FirstNumber;
ShakingMessage.Result=ACK;
int ret=0;
ret=sendto(s,(char *)(&ShakingMessage),sizeof(CCSDef::TMSG_SHAKINGHANDS),0,(LPSOCKADDR)&from,sizeof(from));
if(ret>0)
{
cout<<"date has been send"<<endl;
}
char buffer2[1024]="\0";
SOCKADDR_IN from2;
int fromlen2=sizeof(from2);
ret=recvfrom(s,buffer2,sizeof(buffer2) ,0,(LPSOCKADDR)&from2,&fromlen2);
CCSDef::TMSG_HEADER *pMesgHeader2=NULL;
pMesgHeader2=(CCSDef::TMSG_HEADER*)buffer2;
CCSDef::TMSG_SHAKINGHANDS *ShakingMessage3=(CCSDef::TMSG_SHAKINGHANDS*)pMesgHeader2;
if((ShakingMessage3->SecondNumber==ShakingMessage.SecondNumber)&&(ShakingMessage3->Result==ACK))
{
cout<<"three way hand shake complite"<<endl;
return true;
}
else
{
cout<<"three way hand shake file"<<endl;
return false;
}
}
客户端:
CCSDef::TMSG_HEADER *pMsgHeader=NULL;
CCSDef::TMSG_SHAKINGHANDS ShakingMessage;
int firstnumber=random();
cout<<"random1!!!"<<endl;
cout<<firstnumber<<endl;
ShakingMessage.FirstNumber=firstnumber;
int addrlen=sizeof(sa_in);
int ret=0;
int ref=0;
ret = sendto(s, (char*)(&ShakingMessage), sizeof(CCSDef::TMSG_SHAKINGHANDS),0,(LPSOCKADDR)&sa_in,addrlen);//数据发送函数,注意全部的参数都是[in]
if(ret>0)
cout<<"DATA HAS BEEN SENT..."<<endl;
//while(ref<=0)
//{
recvfrom(s,szbuffer,MAX_PACKET_SIZE + 1,0,(LPSOCKADDR)&sa_in,&addrlen);//数据接受函数,参数5为[out],参数6为[in/out]
//}
pMsgHeader=(CCSDef::TMSG_HEADER*)szbuffer;
CCSDef::TMSG_SHAKINGHANDS *ShakingMessage2=(CCSDef::TMSG_SHAKINGHANDS*)pMsgHeader;
if(ShakingMessage2->FirstNumber==firstnumber && ret>0 && ShakingMessage2->Result==ACK){
ShakingMessage2->Result=ACK;
cout<<ShakingMessage2->FirstNumber<<endl;
cout<<ShakingMessage2->SecondNumber<<endl;
ret = sendto(s,(char*)(&ShakingMessage2), sizeof(CCSDef::TMSG_SHAKINGHANDS),0,(LPSOCKADDR)&sa_in,addrlen);
cout<<ret<<endl;
}
else
{
cout<<"ERROR! NO RESPOND!"<<endl;
system("pause");
}
if(s!=NULL){
closesocket(s);//关闭套接字 之后要注释掉!!!!!!!!!!!
}
cout<<"Fuck Successful!"<<endl;
system("pause");
return true;
------解决方案--------------------
#progma pack (1)
google下就知道了,
既然收到了,你这个问题要不就是字节对齐问题,要不就是你自己的代码逻辑出现了问题,
udp有最大包限制,你这个程序估计也碰不到。
仔细检查发送端发的内容是不是你想发的。