Articles of raw sockets

在AF_PACKET套接字上发送数据

如何在SOCK_PACKET套接字上发送数据,而不指定它绑定的主机? 我已经构build了IP头来显示它应该去,但写()将无法正常工作。

如何在linux内核中添加一个新的自定义第4层协议(一个新的原始套接字)?

我想在linux(ubuntu 14.04)中添加自己定制的第4层协议–IPPROTO_MYPROTO作为可加载的内核模块。 我已经完成了所有必要的步骤来注册协议。 在这里,我分享我的代码。 当我试图从sendmsg()发送用户空间程序的消息时,我期望通过struct proto结构注册的相应的fn myproto_sendmsg()应该在内核空间中调用。 但是我正在观察的是,虽然内核空间中的myproto_sendmsg()没有被调用,但是目标机器正在接收正确的数据。 惊喜! 惊喜! 。 是默认的udp sendmsg()fn在这里踢,就像是不速之客做他的工作。 在这里,用户空间中的sendmsg()调用返回与发送一样多的字节。 因此,FN返回成功。 用户空间程序: void forwardUDP( int destination_node ,char sendString[] ) { struct msghdr msg; destination_node = destination_node % N; //destination node to which data is to be forwaded int sock, rc; struct sockaddr_in server_addr; struct iovec iov; struct hostent *host; //hostent predefined […]

数据包套接字只在混杂模式下接收本地stream量

我有socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))创build一个套接字,我已经设置为混杂模式使用: struct ifreq ifr; strncpy((char*)ifr.ifr_name, interface, IF_NAMESIZE); if(ioctl(sock, SIOCGIFINDEX, &ifr)<0) fail(2); struct packet_mreq mr; memset(&mr, 0, sizeof(mr)); mr.mr_ifindex = ifr.ifr_ifindex; mr.mr_type = PACKET_MR_PROMISC; if(setsockopt(sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) fail(2); 问题是,当我从套接字执行read() ,它只返回来自或到达我的计算机的数据。 我怎样才能读取和处理networking上的所有数据包? Wireshark显示所有的数据包都很好,所以我知道这不是我的电脑或网卡。 ifconfig在运行时报告它是PROMISC 。

如何重现TCP协议与原始套接字正确的三方握手?

我模拟tcp协议的c + +三方握手,随着我的代码运行wireshark。 我的代码工艺在IP和TCP层的头,包装它们,然后将其发送到TCP服务器的TCP标头的SYN标志设置为1的HTTP服务器。 我可以在wireshark上看到完整的数据报,包括ip和tcp头文件。 似乎没有错误。 我的进程使用与已经发送的数据包头中包含的相同的地址和端口来绑定一个套接字。 Wireshark显示数据包已成功发送,但没有任何来自服务器的收入数据包确认我的SYN。 我究竟做错了什么? 我在Ubuntu 10.10,2.6.35-23。 代码很乱,对不起。 它只是为了testing。 main.cpp中: char host[100],buf[1000],*data=NULL,source_ip[20]; //buf is the complete packet sockaddr_in dest; hostent *server; IPV4_HDR *v4hdr=NULL; TCP_HDR *tcphdr=NULL; memset(&buf, 0, sizeof(buf)); cout << "Creating RAW socket…" << endl; int s; if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) == -1) { cout << "Error creating socket: […]

捕获性能与pcap与原始套接字

捕获networkingstream量进行debugging时,似乎有两种常见的方法: 使用原始套接字。 使用libpcap。 在性能方面,这两种方法有什么不同? libpcap似乎是一个很好的兼容方式来听一个真正的networking连接或重放一些jar头数据,但是function集是否带有性能问题?

时间戳输出数据包

我试图得到传出数据包的准确时间戳(使用原始套接字发送)。 根据Linux/Documentation/networking/timestamping.txt ,“对于发送时间标记,发出的数据包会循环回到套接字的错误队列中,并附上发送时间标记,可以用recvmsg(flags = MSG_ERRQUEUE)接收。 ”。 不幸的是, recvmsg总是在原始套接字上调用时返回-1 (使用socket(PF_INET, SOCK_RAW, IPPROTO_RAW)创build, SO_TIMESTAMP使用setsockopt设置为1 )。 我究竟做错了什么? 是否有一个更好的方式获得一个传出数据包的准确时间戳? 附录(信息): 我也尝试从通过UDP套接字发送的数据包(源代码如下)获取时间戳,并且recvmsg返回-1 :错误是“资源暂时不可用”( EAGAIN )。 附录(源代码): #include <arpa/inet.h> #include <linux/net_tstamp.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> void die(char* s) { perror(s); exit(1); } int main(int argc, char* argv[]) { char* destination_ip = "10.0.0.1"; int destination_port = […]