怎么样用出C语言写一个分析TCPIP报文的程

Python012

怎么样用出C语言写一个分析TCPIP报文的程,第1张

socket编程写了一个简单的DNS服务器

是这样实现的,用两台PC,一个做客户端,一个做服务器;

在服务器用socket监视53端口,recvfrom()函数负责接收DNS查询报文,将其存入事先写好的数据结构里;

因为DNS查询报文和应答报文的前部分字段格式都是一样的,只是修改了几个参数,然后重点把DNS应答报文后面的字段进行增添。

然后用sendto();函数发送就可以了。

在ie里面输入任意的网址,回车,就会触发客户端向服务器发出DNS查询报文,

此时你可以同时在服务器和客户端抓包,看收到的报文是否正确。

注意几点:

1、一定要熟悉报文结构,定义合适的结构体,将报文进行解析

2、一定要注意网络序和主机序的转换htonl(),htons(),ntohl(),ntohs()等

3、找个熟知端口,最好是你熟悉的协议,如ftp,http,dns等。

4、客户端要把DNS服务器配置为你的服务器ip。

// server.c 需要的自己改下···

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <sys/wait.h>

#include <signal.h>

#define MYPORT 80

#define BACKLOG 10

void sigchld_handler(int s)

{

while(wait(NULL) >0)

}

int main(void)

{

int sockfd, new_fd

struct sockaddr_in my_addr

struct sockaddr_in their_addr

int sin_size

struct sigaction sa

int yes=1

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

perror("socket")

exit(1)

}

if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {

perror("setsockopt")

exit(1)

}

my_addr.sin_family = AF_INET

my_addr.sin_port = htons(MYPORT)

my_addr.sin_addr.s_addr = INADDR_ANY

memset(&(my_addr.sin_zero), '\0', 8 )

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {

perror("bind")

exit(1)

}

if (listen(sockfd, BACKLOG) == -1) {

perror("listen")

exit(1)

}

sigemptyset(&sa.sa_mask)

sa.sa_flags = SA_RESTART

if (sigaction(SIGCHLD, &sa, NULL) == -1) {

perror("sigaction")

exit(1)

}

while(1) { // main accept() loop

sin_size = sizeof(struct sockaddr_in)

if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {

perror("accept")

continue

}

printf("server: got connection from %s\n",inet_ntoa(their_addr.sin_addr))

if (!fork()) { // this is the child process

close(sockfd)// child doesn't need the listener

if (send(new_fd, "Hello, world!\n", 14, 0) == -1)

perror("send")

close(new_fd)

exit(0)

}

close(new_fd)

}

return 0

}

这个还是比较麻烦的

首先 你得知道wireshark包的具体结构

这个比较简单 其实就是标准的网络数据包

然后 显示的话 最简单的 就是读文件,显示二进制数据。

再复杂一些 需要针对含义 做解析,这就需要你知道网络数据结构。 是一个很大工作量的事情

再做的好看一些,就是像wireshark那样,有图形目录,包分析,解析,树状结构

如果你只是练手的话,可以找某类报文选择几种协议,或者就一种,做解析。

其它的类似。