- 论坛徽章:
- 1
|
我想使用原始socket来尝试模拟tcp的三次握手,但是接受到的数据总是不对,代码如下,麻烦各位指教一下,我是新手,刚开始学习使用原始socket
谢谢:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char** argv)
{
//创建原始socket,基于tcp协议的
int sockfd;
sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
struct sockaddr_in addr,clientaddr;
addr.sin_family=AF_INET;
addr.sin_port=htons(4000);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");
//构造tcp header syn位置1
char buff[50];
struct tcphdr *tcp;
tcp=(struct tcphdr*)buff;
tcp->source=htons(9000);
tcp->dest=htons(4000);
tcp->seq=htonl(100);
tcp->ack_seq=0;
tcp->doff=0;
tcp->syn=1;
//发送数据,并接受返回
printf("%d\n",sendto(sockfd,buff,50,0,(struct sockaddr*)&addr,(socklen_t)sizeof(struct sockaddr_in)));
memset(buff,'\0',50);
int length=sizeof(struct sockaddr_in);
recvfrom(sockfd,buff,50,0,(struct sockaddr*)&clientaddr,&length);
//打印返回得到的两个数据ack_seq以及source的port,(但是得到的是错误之)
tcp=(struct tcphdr*)buff;
printf("tcp ack_seq:%u\n",ntohl(tcp->ack_seq));
printf("client port:%u\n",ntohs(tcp->source));
sleep(100);
}
麻烦帮我看一下 多谢 |
|