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

umbrella1984 2006-03-02 02:45:34
我的程序发一个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应答,只不知道怎么再发一次本地的应答给服务器,望高手指教。。谢谢!!!
...全文
275 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
umbrella1984 2006-06-27
  • 打赏
  • 举报
回复
upp
umbrella1984 2006-04-03
  • 打赏
  • 举报
回复
up
cloudboy 2006-03-07
  • 打赏
  • 举报
回复
怎么可能找不到 tcp/ip协议 卷一 到处都是电子书,你不可能要别手把手的教你把
umbrella1984 2006-03-06
  • 打赏
  • 举报
回复
恳求有经验的兄弟帮忙,在网上找不到相关资料,郁闷坏了。。
cloudboy 2006-03-06
  • 打赏
  • 举报
回复
你要仔细看看协议的内容就知道了。 大约是把ack的值+1再返回去
umbrella1984 2006-03-03
  • 打赏
  • 举报
回复
对啊,我想知道代码是怎么样的,楼上的能给代码参考一下吗?我知道协议是发回个ACK,只是不知道代码不知道怎么写。。。
oyljerry 2006-03-02
  • 打赏
  • 举报
回复
简单的也就是对服务端ACK的ACK
oyljerry 2006-03-02
  • 打赏
  • 举报
回复
参考TCP/IP,返回的ACK,客户完成第三次握手(也是ACK)

18,355

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧