linux raw socket 发送ip报文,Raw Socket Linux发送/接收数据包

在接收数据包时遇到一些问题.

我可以接收和读取传入的数据包,但我想我不会与任何主机握手.

我只想在收到答案的情况下将数据包发送到具有开放端口的远程计算机,以查看TTL(生存时间)和窗口大小.

有谁知道错误在哪里? (我对C编程知之甚少)

码:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

struct pseudohdr {

u_int32_t src_addr;

u_int32_t dst_addr;

u_int8_t padding;

u_int8_t proto;

u_int16_t length;

};

struct data_4_checksum {

struct pseudohdr pshd;

struct tcphdr tcphdr;

char payload[1024];

};

unsigned short comp_chksum(unsigned short *addr, int len) {

long sum = 0;

while (len > 1) {

sum += *(addr++);

len -= 2;

}

if (len > 0)

sum += *addr;

while (sum >> 16)

sum = ((sum & 0xffff) + (sum >> 16));

sum = ~sum;

return ((u_short) sum);

}

int main(int argc, char *argv[]) {

int sock, bytes, on = 1;

char buffer[1024];

struct iphdr *ip;

struct tcphdr *tcp;

struct sockaddr_in to;

struct pseudohdr pseudoheader;

struct data_4_checksum tcp_chk_construct;

if (argc != 2) {

fprintf(stderr, "Usage: %s ", argv[0]);

fprintf(stderr, "\n");

return 1;

}

sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);

if (sock == -1) {

perror("socket() failed");

return 1;

}else{

printf("socket() ok\n");

}

if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) == -1) {

perror("setsockopt() failed");

return 2;

}else{

printf("setsockopt() ok\n");

}

ip = (struct iphdr*) buffer;

tcp = (struct tcphdr*) (buffer + sizeof(struct tcphdr));

int iphdrlen = sizeof(struct iphdr);

int tcphdrlen = sizeof(struct tcphdr);

int datalen = 0;

printf("Typecasting ok\n");

ip->frag_off = 0;

ip->version = 4;

ip->ihl = 5;

ip->tot_len = htons(iphdrlen + tcphdrlen);

ip->id = 0;

ip->ttl = 40;

ip->protocol = IPPROTO_TCP;

ip->saddr = inet_addr("192.168.165.135");

ip->daddr = inet_addr(argv[1]);

ip->check = 0;

tcp->source = htons(12345);

tcp->dest = htons(80);

tcp->seq = random();

tcp->doff = 5;

tcp->ack = 0;

tcp->psh = 0;

tcp->rst = 0;

tcp->urg = 0;

tcp->syn = 1;

tcp->fin = 0;

tcp->window = htons(65535);

pseudoheader.src_addr = ip->saddr;

pseudoheader.dst_addr = ip->daddr;

pseudoheader.padding = 0;

pseudoheader.proto = ip->protocol;

pseudoheader.length = htons(tcphdrlen + datalen);

tcp_chk_construct.pshd = pseudoheader;

tcp_chk_construct.tcphdr = *tcp;

int checksum = comp_chksum((unsigned short*) &tcp_chk_construct,

sizeof(struct pseudohdr) + tcphdrlen + datalen);

tcp->check = checksum;

printf("TCP Checksum: %i\n", checksum);

printf("Destination : %i\n", ntohs(tcp->dest));

printf("Source: %i\n", ntohs(tcp->source));

to.sin_addr.s_addr = ip->daddr;

to.sin_family = AF_INET;

to.sin_port = tcp->dest;

bytes = sendto(sock, buffer, ntohs(ip->tot_len), 0, (struct sockaddr*) &to,

sizeof(to));

if (bytes == -1) {

perror("sendto() failed");

return 1;

}

recv(sock, buffer, sizeof(buffer), 0);

printf("TTL= %d\n", ip->ttl);

printf("Window= %d\n", tcp->window);

printf("ACK= %d\n", tcp->ack);

printf("%s:%d\t --> \t%s:%d \tSeq: %d \tAck: %d\n",

inet_ntoa(*(struct in_addr*) &ip->saddr), ntohs(tcp->source),

inet_ntoa(*(struct in_addr *) &ip->daddr), ntohs(tcp->dest),

ntohl(tcp->seq), ntohl(tcp->ack_seq));

return 0;

}

Linux raw socket Linux raw socket==========================================1. 为什么要详细了解raw socket呢? 其实很早以前就对原始套接字有了一定的了解,那时候还做过一个小的抓包程序,当时以为对原始套接字很熟悉了,但是最近在看nmap的时候被其中的一句话给整迷糊了。  在《Nmap Network Discovery III》的SYN scan章 阅读详情

相关推荐

Linux Raw Socket使用总结

学过socket基础编程的同学都知道,应用层socket(如使用SOCK_STREAM创建的TCP socket,SOCK_DGRAM创建的UDP socket)都只能收发应用层的数据,出于业务应用的需要,可能需要获取IP层甚至是以太层的数据,这就需要用到socket接口中另一种更加强大的类型RAW socket。 使用SOCK_RAW创建的RAW socket,可以收发包含IP层的报文

sprintwind的专栏 3217

C语言lldp接收程序

接收局域网lldp消息,并解析展示

IP层实现4-raw socket 接收数据

在接收数据时,在ip_local_deliver_finish函数中会先调用

u014211079的专栏 2440

linux socket 发送ip报文,linux下socket收IP数据包

static int init_socket() { int raw_sockfd_l2 = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)); struct sockaddr_ll sock_ip_pack; if (raw_sockfd_l2 0) { printf(%s:%d:%s create the l2 raw socket is fail,__...

weixin_31110741的博客 948

linux socket raw发送,使用raw socket发送以太网帧

/** send a raw ethernet frame*/#include //memcpy()#include //strxxx()#include //close()#include //socket()#include //htons()#include //struct ...

weixin_35476698的博客 1343

Linux下raw socket编程

参考文章: (1)博客园-raw socket 通常所说的socket通信是指通假字通信,也就是IP层往上的,IP+接口号完成套接字通信。这种情况下通信产生的数据包如TCP/UDP/ICMP包。某些情况下我们需要执行更底层的操作,通过raw socket通信可以完成基于数据链路层的socket通信。 raw socket的主要结构为:sockfd = socket(PARAM1, SOCK_...

CHANGQINGTENGCJM的专栏 877

Linux中利用RAW SOCKET直接通过网卡收发数据

问题背景:公司原来为了搜索局域网内的网络视频解码器开发了一个Decoder Finder,用的是UDP广播的方式。现在韩国的客户发现当IP地址和PC不在同一网段时,无法搜索到decoder,人家还找了一个他们的软件,暴强,就算是IP地址全是0,照搜不误。 问题分析: PC端,其实也就是用winpcap,直接和网卡通信,把消息包发出来,并且在接受响应。这样数据包不经过IP和UDP协议栈,

Alan0521的专栏 1万+

运用Raw Socket进行以太网帧解析

RAW SOCKETRAW Socket提供了一种方法来绕过整个网络堆栈遍历,并直接将以太网帧输送到一个应用程序的方法。(跳过网络层和传输层的过滤解析,因而可以直接处理新的或是自定义的数据包格式)常用创建RAW Socket格式的方法:AF_PACKET和PF_SOCKET。AF_PACKET用于win和mac系统。本篇介绍基于Linux的PF_PACKET创建方法。基于PF_PACKET的PF_...

Athrun_misou的博客 2446

linux原始套接字raw获取ip包,Linux网络编程:原始套接字 SOCK_RAW, IPV6 rawsocket

比较新的内核才支持socket(fd, SOCK_RAW, IPPROTO_UDP); // 指定 TCP/UDP/ICMPint val = 1;ret = setsockopt(test->state.sockfd, IPPROTO_IPV6, IPV6_HDRINCL, &val, sizeof(val)); // 比较新的内核才支持remote.sin6_port = 0; ...

weixin_39576127的博客 846

Raw Socket 接收和发送数据包

snippet/raw-socket.md at master · xgfone/snippet · GitHubhttps://github.com/xgfone/snippet/blob/master/snippet/docs/linux/program/raw-socket.md Raw Socket 接收和发送数据包 前言 对于网络层IP数据包的接收、发送,RAW SOCKET 接口是通用的,具有可移植性。 但对于数据链路层数据帧的接收、发送,不同的系统有不同的机制,不具有可移植性。 对于

maimang1001的专栏 2万+

Linux socket CAN编程示例

如下所示,代码展示了Linux下CAN的发送和接收:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <net/if.h> #include <sys/ioctl.h> #include <sys...

jirryzhang的博客 1万+

socket(AF_INET, SOCK_RAW, IPPROTO_IP)的意思

这是include/linux/in.h里的定义: /* Standard well-defined IP protocols. */ enum { IPPROTO_IP = 0,   /* Dummy protocol for TCP   */ IPPROTO_ICMP = 1,   /* Internet Control Message Protocol */ IPPROTO_IGM

just thinking 4833

linux下socket收IP数据包

int   raw_sockfd_l2 = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));   struct sockaddr_ll sock_ip_pack;     if (raw_sockfd_l2     {         printf("%s:%d:%s create the l2 raw socket is fail"

小饼仙子的专栏 1582

基于raw socket的UDP数据发送与接收:网络编程新视角

基于raw socket的UDP数据发送与接收:网络编程新视角 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代网络编程中,UDP协议以其简单、高效的特点被广泛应用于各类场景。本项目正是基于这样的需求,利用raw socket技术实现UDP数据包的发送与接收,为开发者提供了一个深入网络底层、自定义数据包的实践平台。 项目技术分析 核心功能 基于raw socket...

gitblog_06771的博客 632

使用PF_PACKET和SOCK_RAW发送自定义type以太网数据包

本文介绍使用PF_PACKET和SOCK_RAW发送自定义type以太网数据包,使用wireshare抓包可以获取到数据包,为Linux内核增加网络协议做铺垫。 先上码: #include #include #include           // close() #include           // strcpy, memset(), and memcpy() #in

dean_gdp的专栏 1万+

如何使用raw socket发送UDP报文

大多数的网络编程都是在应用层接收数据和发送数据的,本文介绍在数据链路层的网络编程方法,介绍如何在数据链路层直接接收从物理层发过来的原始数据数据包,文章给出了一个完整的范例程序。

whowin 1833

Linux下使用原始socket收发数据包

本文介绍了Linux系统中使用原始Socket处理底层网络数据包的方法。主要内容包括: 创建原始Socket:使用AF_PACKET和SOCK_RAW参数创建socket,可处理网络层以下数据包(ICMP/ARP等) 绑定网口:通过if_nametoindex获取网口索引,使用sockaddr_ll结构绑定到socket 数据包结构:详细说明二层数据包的14字节头部结构

hello world的博客 1042

linux下使用RAW SOCKET接收LLDP报文并解析LLDP报文

linux下使用RAW SOCKET接收LLDP报文并解析,纯C代码,可使用GCC直接编译,测试通过。

上一篇: linux下编译安装nginx,Linux(CentOS6.5)下编译安装Nginx官方最新稳定版(nginx-1.10.1)
下一篇: Linux 文件通知机制,文件监控与通知机制 audit inotify
weixin_28693447
博客等级 码龄10年 36粉丝 1212原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值