网卡抓包:从同一个网卡收包后再发回这个网卡抓不到这个包吗?

zpzkitt zpzkitt 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
假设我的eth0网卡的ip是192.168.1.10,其他机器(另一台实体机器)用tcp方式发送数据包到eth0上,然后我从eth0收的这些数据包,解析修改之后用udp的方式再将新的内容发送给eth0,同时我希望用tcpdump从eth0上能把我修改之后的数据包抓取下来。
问题:我抓不到我自己发送的数据包。为什么呢?
附上我自己写的发包和收包的代码
收包程序:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <errno.h>
#include <assert.h>
#include <netdb.h>

#include <signal.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/wait.h>

#define ASSIGN_BUF(dst, src, dst_size) \
*(dst++) = src; dst_size--;

#define RECV_BUFSIZE 65536 /* size of an I/O buffer */
#define SEND_BUFSIZE 2048

typedef struct { /* type of structure for a socket */
int recv_fd; /* recv socket */
char buf[RECV_BUFSIZE]; /* reading buffer */
char *rp; /* reading pointer */
char *ep; /* end pointer */
int end; /* end flag */
int soerrno;
int freetime;
} recv_socket;

typedef struct { /* type of structure for a socket */
int send_fd; /* send socket */
char buf[SEND_BUFSIZE]; /* reading buffer */
int buf_len;
} send_socket;

recv_socket *r_fd;
send_socket *s_fd;
char *recv_ip_port[3] = {0};
char *send_ip_port[3] = {0};
int task_runing;

void init_daemon(void)
{
int pid;
int i;
pid=fork();
if(pid > 0){
printf("exit1\n");
exit(0); //是父进程,结束父进程
}else if(pid< 0){
printf("exit2\n");
exit(1); //fork失败,退出
}else{
//是第一子进程,后台继续执行
setsid(); //第一子进程成为新的会话组长和进程组长
//并与控制终端分离
pid=fork();
if(pid > 0){
printf("exit3\n");
exit(0); //是第一子进程,结束第一子进程
}else if(pid < 0){
printf("exit4\n");
exit(1); //fork失败,退出
}else{
//是第二子进程,继续
//第二子进程不再是会话组长
for(i=0;i< NOFILE;++i){
close(i); //关闭打开的文件描述符
}

chdir("/tmp"); //改变工作目录到/tmp
umask(0); //重设文件创建掩模
}
}
return;
}


int recv_getc(recv_socket *recv_sock)
{
assert(recv_sock);

if(recv_sock->rp < recv_sock->ep){
// printf("%02x ", *(unsigned char *)(recv_sock->rp));
return *(unsigned char *)(recv_sock->rp++);
}

do {
int rv = recv(recv_sock->recv_fd, recv_sock->buf, RECV_BUFSIZE, 0);

#if 0
int i;
for(i = 0;i < 1024;i++){
printf("%02x ", (unsigned char)recv_sock->buf[i]);
}
printf("\n");
#endif

if(rv > 0){
recv_sock->rp = recv_sock->buf + 1;
recv_sock->ep = recv_sock->buf + rv;
return *(unsigned char *)recv_sock->buf;
} else if(rv == 0){
recv_sock->end = 1;
return -1;
}
} while(errno == EINTR);
if(errno == EAGAIN) {
recv_sock->soerrno = EAGAIN;
}
recv_sock->end = 1;
return -1;
}

int seg_len()
{

return -1;
}

int head_check(recv_socket *recv_sock)
{
assert(recv_sock);
uint16_t len;
int i, ret = 0;

/*jump two byte*/
recv_getc(recv_sock);
recv_getc(recv_sock);

/*get total len*/
len = (uint16_t)recv_getc(recv_sock) << 8;
len |= (uint16_t)recv_getc(recv_sock);

if(len < 20 || len > 1024){
printf("len error!\n");
return -1;
}

/*jump 12 byte*/
for(i = 0;i < 12;i++){
ret = recv_getc(recv_sock);
if(ret < 0){
printf("recv data failed!\n");
return -1;
}else if(ret != 0){
printf("check failed!\n");
return -2;
}
}
return len;
}

int get_data(recv_socket *recv_sock, char *buf, int size, int head_len)
{
uint16_t radius_len = 0, tmp = 0;
uint16_t c = 0;
/*jump 2 byte*/
c = recv_getc(recv_sock);
ASSIGN_BUF(buf, c, size)
c = recv_getc(recv_sock);
ASSIGN_BUF(buf, c, size)
/*get radius length*/
c = (uint16_t)recv_getc(recv_sock);
radius_len = c << 8;
ASSIGN_BUF(buf, c, size)
c = (uint16_t)recv_getc(recv_sock);
radius_len |= c;
ASSIGN_BUF(buf, c, size)

if(radius_len < 20 || radius_len > 1024 || (head_len != (radius_len + 12))){
printf("radius length error!\n");
return -2;
}
tmp += 4;
while(size > 0){
if((c = recv_getc(recv_sock)) < 0){
return -1;
}
*(buf++) = c;
size--;
if(++tmp == radius_len){
break;
}
}
return tmp;
}

int recv_pock(recv_socket *recv_sock, char *buf, int size)
{
assert(recv_sock && buf && size >= 0);
int ret = 0;

if((ret = head_check(recv_sock)) < 0){
printf("head check failed!\n");
return -1;
}
if((ret = get_data(recv_sock, buf, size, ret)) < 0){
return -1;
}
return ret; /*return radius len*/
}

int send_pock(send_socket *send_sock, char *buf, int buf_len)
{
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
if(inet_aton(send_ip_port[1], &addr.sin_addr) == 0){
printf("ipadd error!");
return -1;
}
int snum = atoi(send_ip_port[2]);
addr.sin_port = htons(snum);
int ret = 0;

#if 0
int i;
for(i = 0;i < 418;i++){
printf("%02x ", (unsigned char)buf[i]);
}
printf("\n");
#endif

ret = sendto(send_sock->send_fd, buf, buf_len, 0, (struct sockaddr*)&addr, sizeof(addr));
if(ret != buf_len){
printf("send error!\n");
return -1;
}
return 0;
}

int init_recv_sock(char *argv[])
{
int ret;

if((r_fd->recv_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0){
perror("recv socket:");
return -1;
}

struct sockaddr_in client_addr;
bzero(&client_addr,sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_addr.s_addr = htons(INADDR_ANY);
client_addr.sin_port = htons(0);

if((ret = bind(r_fd->recv_fd, (struct sockaddr*)&client_addr, sizeof(client_addr))) != 0){
perror("recv bind:");
return -1;
}

struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;

if(inet_aton(argv[1], &server_addr.sin_addr) == 0) {
printf("ipaddr error!\n");
return -1;
}
int snum = atoi(argv[2]);

server_addr.sin_port = htons(snum);
if(connect(r_fd->recv_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) != 0){
perror("recv connect");
return -1;
}
return 0;
}

int deinit_recv_sock()
{
close(r_fd->recv_fd);
return 0;
}

int init_send_sock(char *argv[])
{
if((s_fd->send_fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0){
perror("send socket");
return -1;
}

#if 0
if(bind(s_fd->send_fd, (struct sockaddr*)&addr, sizeof(addr)) != 0){
perror("send bind");
return -1;
}
#endif
return 0;
}

int deinit_send_sock()
{
close(s_fd->send_fd);
return 0;
}

int init_socket(int argc, char *argv[])
{
if(argc != 0){
recv_ip_port[1] = argv[1];
recv_ip_port[2] = argv[2];

send_ip_port[1] = argv[3];
send_ip_port[2] = argv[4];
}

r_fd = (recv_socket *)calloc(1, sizeof(recv_socket));
s_fd = (send_socket *)calloc(1, sizeof(send_socket));
if(init_recv_sock(recv_ip_port) < 0){
return -1;
}

if(init_send_sock(send_ip_port) < 0){
return -1;
}
return 0;
}

int deinit_socket()
{
task_runing = 0;
deinit_recv_sock();
deinit_send_sock();
free(r_fd);
free(s_fd);
return 0;
}

int reinit()
{
deinit_socket();
init_socket(0, NULL);
return 0;
}

int num = 0;

int proc_msg()
{
char buf[1024];
int recv_len;
while(task_runing){
// sleep(1);
memset(buf, 0, sizeof(buf));
recv_len = recv_pock(r_fd, buf, 1024);
if(recv_len < 0){
reinit();
continue;
}
send_pock(s_fd, buf, recv_len);
// printf("3\n");
if((num++) >= 65535){
num = 0;
}
// printf("num = %d\n", num);
}
return 0;
}

int main(int argc, char *argv[])
{
int pid;
task_runing = 1;
if(argc < 5){
printf("arg too few!\n");
return -1;
}else if(atoi(argv[4]) != 1812 && atoi(argv[4]) != 1813){
printf("dst port is error!\n");
return -1;
}

if(init_socket(argc, argv) < 0){
return -1;
}
// printf("4\n");
// init_daemon();
// printf("1\n");

while(1){
pid = fork();
if(pid > 0){
wait(NULL);
}else if(pid < 0){
return -1;
}else{
proc_msg();
// printf("2\n");
break;
}
}

printf("exit!\n");
deinit_socket();
return -1;
}

...全文

相关推荐

评论 1
收藏 已收藏
分享
返回顶部
zpzkitt
通信技术 4,397 成员 28,909 内容