跪求.......C++的大大们过来一下............关于memcpy缓冲区的请教............急急急急急急急急急急急急急急急.....
由于本人当前在家分休假笔记本里没有C++编译器,故对无法测试下面一小段的C++代码结果。对于其中的疑惑想请高手解答一下。问题部分,我将以红色标注……
//计算TCP校验和,计算校验和时需要包括TCP pseudo header
memcpy(SendBuf,&psd_header,sizeof(psd_header)); //内存复制TCP伪首部缓冲区到 SendBuf变量
memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header)); //通过SendBuf+sizeof(psd_header)移动指针,再将tcp_header的缓冲区复制合并
tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header)); //用checksum函数计算校验和,并将返回值赋给tcp_header.th_sum
//计算IP校验和
memcpy(SendBuf,&ip_header,sizeof(ip_header)); //内存复制ip报头中的首部缓冲区到 SendBuf变量
memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header)); //通过SendBuf+sizeof(ip_header)移动指针,再将tcp_header的缓冲区复制合并
memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4); //通过SendBuf+sizeof(ip_header)+sizeof(tcp_header)移动指针,并向后填充4个零
datasize=sizeof(ip_header)+sizeof(tcp_header); //计算IP报头和TCP报头加在一起的长度
ip_header.checksum=checksum((USHORT *)SendBuf,datasize); //用checksum函数计算校验和,并将返回值赋给ip_header.checksum
//填充发送缓冲区
memcpy(SendBuf,&ip_header,sizeof(ip_header)); //...这行代码我很是不解。在上面的校验和计算中SendBuf缓冲区里已经有了IP报头数据和TCP报头数据。那么现在SendBuf缓冲区里到底是全部被ip_header重新覆盖了还是部分被覆盖了。
//发送TCP报文 Win_Socket sendto
ErrorCode=sendto( //指定目的地发送数据,sendto()适用于已连接的数据报或流式套接口发送数据。返回值为整型,如果成功,则返回发送的字节数,失败则返回0
SockRaw, //参数1.Socket创建句柄
SendBuf, //报文缓冲区指针 如果SendBuf缓冲区里只有ip_header,那么tcp_header在整个过程中岂不是仅仅为了校验和而存在?!!!
datasize, //缓冲区长度
0, //调用方式标志位, 一般为0, 改变Flags,将会改变Sendto发送的形式
(struct sockaddr*) &DestAddr, //(可选)指针,指向目的套接字的地址
sizeof(DestAddr)); //(可选)指针指向目的套接字的地址的长度