原始套接字如何与服务器建立第三次握手ACK确认以开始发送数据。

时间:2022-02-10 11:01:39
我的程序发一个SYN连接一个服务器,服务器返回ACK应答,这时候我该怎么回复这个应答才可以建立真正的连接来发送数据?

下面是发送SYN给服务器的代码:

//IP头填写
ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long)); 
// ipHeader.tos=0; 
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader)); 
ipHeader.ident=1; 
ipHeader.frag_and_flags=0; 
ipHeader.ttl=128; 
ipHeader.proto=IPPROTO_TCP; 
ipHeader.checksum=0; 
ipHeader.sourceIP=inet_addr(ip);//本地IP
ipHeader.destIP=inet_addr(dip);//服务器IP

//填写TCP头
tcpHeader.th_dport=htons(80); //服务器端口
tcpHeader.th_sport=htons(8288); //本地端口
tcpHeader.th_seq=htonl(0x12345678); 
tcpHeader.th_ack=0; 
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0); 
tcpHeader.th_flag=2; //标志2为SYN包
tcpHeader.th_win=htons(512); 
tcpHeader.th_urp=0; 
tcpHeader.th_sum=0; 

psdHeader.saddr=ipHeader.sourceIP; 
psdHeader.daddr=ipHeader.destIP; 
psdHeader.mbz=0; 
psdHeader.ptcl=IPPROTO_TCP; 
psdHeader.tcpl=htons(sizeof(tcpHeader)); 

memcpy(szSendBuf, &psdHeader, sizeof(psdHeader)); 
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader)); 
tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader)); 

memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); 
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader)); 
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4); 
ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader)); 

memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); 

rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader), 
0, (struct sockaddr*)&addr, sizeof(addr)); 

if ( rect == SOCKET_ERROR ) 

CString mess;
mess.Format("连接错误,代码:%d",WSAGetLastError());
Over=TRUE;
AfxMessageBox(mess); 
return; 
}



....接收的我是用WSAIoctl截取所有包来分析的,只要从外面发到本机8288端口的数据我就收下来分析。在里面我已经收到了服务器的ACK应答,只不知道怎么再发一次本地的应答给服务器,望高手指教。。谢谢!!!

8 个解决方案

#1


参考TCP/IP,返回的ACK,客户完成第三次握手(也是ACK)

#2


简单的也就是对服务端ACK的ACK

#3


对啊,我想知道代码是怎么样的,楼上的能给代码参考一下吗?我知道协议是发回个ACK,只是不知道代码不知道怎么写。。。

#4


你要仔细看看协议的内容就知道了。 大约是把ack的值+1再返回去

#5


恳求有经验的兄弟帮忙,在网上找不到相关资料,郁闷坏了。。

#6


怎么可能找不到 tcp/ip协议 卷一   到处都是电子书,你不可能要别手把手的教你把

#7


up

#8


upp

#1


参考TCP/IP,返回的ACK,客户完成第三次握手(也是ACK)

#2


简单的也就是对服务端ACK的ACK

#3


对啊,我想知道代码是怎么样的,楼上的能给代码参考一下吗?我知道协议是发回个ACK,只是不知道代码不知道怎么写。。。

#4


你要仔细看看协议的内容就知道了。 大约是把ack的值+1再返回去

#5


恳求有经验的兄弟帮忙,在网上找不到相关资料,郁闷坏了。。

#6


怎么可能找不到 tcp/ip协议 卷一   到处都是电子书,你不可能要别手把手的教你把

#7


up

#8


upp