|
我用自定义TCP报头,发送出去一个SYN报文,使用sniffer可以接受到一个RST报文,可使用recvfrom()就是不能接受,请问还有什么方法接受?
下面是部分源码:(对IP和TCP头都已经负值)
[code:1]
int main(int argc, char *argv[])
{
char recv_buff[MAX_BUFF_LEN];
int SZE = sizeof(DestAddr);//目标地址长度
struct sockaddr_in from;
int fromlen=sizeof(from);
ULONG t=0,t1=0,t2=0;
//参数少于2个,输出帮助信息,退出
if (argc < 2)
{
Usage();
return 0;
}
if(!GetIpAndPortByLine(argv[1]))
return 0;
//初始化连接
if(!SetInitializeSock())
return 0;
//填充数据和计算检验和
Send_Data_Size=10;
memset(Send_Dest_Data,'a',Send_Data_Size);
if(!AccCheckSum())
return 0;
//DestAddr初始化
memset(&DestAddr, 0, sizeof(DestAddr));
DestAddr.sin_family = AF_INET; //internet网络
DestAddr.sin_port = htons(PORTT); //目的端口
DestAddr.sin_addr.s_addr = htonl(IPTL); //目的IP
memset(recv_buff,0,MAX_BUFF_LEN);
ser.sin_family=AF_INET;
ser.sin_addr.s_addr=ip_header.sourceIP;//源IP
ser.sin_port=htons(SPORT);//源端口
ErrorCode = bind(SockRaw,(struct sockaddr*)&ser,sizeof(ser));
if (ErrorCode == SOCKET_ERROR)
{
fprintf(stderr, "bind() 函数失败,错误代码: %d\n", WSAGetLastError());
return 0;
}
/* from.sin_family=AF_INET;
from.sin_addr.s_addr=htonl(IPTL);
from.sin_port=htons(PORTT);
fromlen=sizeof(from);
*/
/*第一次发送*/
ErrorCode=sendto(SockRaw,Send_Buff,HL,0,(SOCKADDR*)&DestAddr,SZE);
t1=GetTickCount();
if (ErrorCode==SOCKET_ERROR)
{
fprintf(stderr, "\n数据发送错误,错误代码:%d\n" ,GetLastError());
return 0;
}
fprintf(stderr,"\n第一次发送%d的数据\n",ErrorCode);//打印发送字节总数
ErrorCode=recvfrom(SockRaw,recv_buff,MAX_BUFF_LEN,MSG_PEEK,(struct sockaddr*)&from,&fromlen);
t2=GetTickCount();
if (ErrorCode==SOCKET_ERROR)
{
fprintf(stderr,"\n数据接受错误,错误代码:%d\n" ,GetLastError());
return 0;
}
fprintf(stderr,"\n第一次接受%d的数据\n",ErrorCode);//打印发送字节总数
fprintf(stderr,"\nt2-t1=%d\n",t2-t1);
closesocket(SockRaw);
WSACleanup();
return 1;
}
[/code:1] |
|