Linux数据报文接收发送总结1
0. 引
如下简单的一段在代码,我们在Linux上运行;同时再运行一服务端的回显;
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>int main(void)
{int sk = 0;struct sockaddr_in ser;char buf[1024] = {0};int addr_len = 0;int ret = 0;sk = socket(AF_INET, SOCK_DGRAM, 0);if(0 > sk){printf("socket error.\n");return -1;}sprintf(buf, "Hello ! %u", time(NULL));memset(&ser, 0x0, sizeof(ser));ser.sin_family = AF_INET;ser.sin_port = htons(2323);ser.sin_addr.s_addr = inet_addr("192.168.185.1");ret = sendto(sk, buf, sizeof(buf), 0 , (struct sockaddr *)&ser, sizeof(ser));if(0 > ret){printf("Sendto error.\n");close(sk);return -1;}printf("-> %s\n", buf);memset(&ser, 0x0, sizeof(ser));memset(buf, 0x0, sizeof(buf));addr_len = sizeof(ser);ret = recvfrom(sk, buf, sizeof(buf), 0 , (struct sockaddr *)&ser, &addr_len);if(0 > ret){printf("recvfrom error.\n");close(sk);return -1;}printf("Recv %s:%d\n", inet_ntoa(ser.sin_addr), ntohs(ser.sin_port));printf("<- %s\n", buf);close(sk);return 0;
}
运行结果如下:
[root@localhost test]# ./a.out
-> Hello ! 1605946250Recv 192.168.185.1:2323
<- Hello ! 1605946250[root@localhost test]#
在这个过程中,Linux系统是如何创建socket的,以及数据报文是如何从网卡上发送和接收,并再返回给应用程序的,本次就开始我们的探险之旅。
通过本文,意在贯穿Linux网络系统内部是如何处理的,以及各个部分之间如何交互。限作者水平,如有错误,请不吝指出。
Linux数据报文接收发送总结1相关推荐
- Linux数据报文接收发送总结6
2.3 协议栈注册 内核实现了网络层的ip协议,也实现了传输层的tcp协议和udp协议.这些协议对应的实现函数分别是ip_rcv(),tcp_v4_rcv()和udp_rcv().和我们平时写代码的方 ...
- Linux数据报文接收发送总结5
2.2 网络子系统初始化 linux内核通过调用subsys_initcall来初始化各个子系统,在源代码目录里你可以grep出许多对这个函数的调用.这里我们要说的是网络子系统的初始化,会执行到net ...
- Linux数据报文接收发送总结4
二.系统初始化 Linux驱动,内核协议栈等等模块在具备接收网卡数据包之前,要做很多的准备工作才行.比如要提前创建好ksoftirqd内核线程,要注册好各个协议对应的处理函数,网络设备子系统要提前初始 ...
- Linux数据报文接收发送总结3
1.3 协议分层 大概了解了网卡驱动.硬中断.软中断和ksoftirqd线程之后,我们在这几个概念的基础上给出一个内核收包的路径示意: 当网卡上收到数据以后,Linux中第一个工作的模块是网络驱动.网 ...
- Linux数据报文接收发送总结2
1. 准备工作 此处重点介绍基础概念,为后面介绍数据包收发打下基础.本次代码层面基于Linux 4.4 Kernel. 1.1 系统调用 Linux的系统运行分为用户态和内核态,内核态控制着系统资源. ...
- Linux数据报文接收发送总结7
2.4 网卡驱动初始化 每一个驱动程序(不仅仅只是网卡驱动)会使用 module_init 向内核注册一个初始化函数,当驱动被加载时,内核会调用这个函数.比如igb网卡驱动的代码位于drivers/n ...
- linux网络报文接收发送浅析_Docker容器网络-基础篇
Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/Netfilter.网桥.路由等.接下来, ...
- Linux SYN报文接收及发送SYNACK报文
注:本文分析基于3.10.0-693.el7内核版本,即CentOS 7.4 在分析connect()系统调用时,我们已经发送SYN报文,所以服务端就需要作出回应了.我们依然只分析TCP层的操作.SY ...
- linux IPv4报文处理浅析
在<linux网络报文接收发送浅析>一文中介绍了数据链路层关于网络报文的处理. 对于接收到的报文,如果不被丢弃.不被网桥转发,会调用netif_receive_skb()提交给IP层: 而 ...
最新文章
- HDU - 6486 Flower(思维)
- python爬取公众号历史文章_python爬微信公众号前10篇历史文章(6)-话说http cookies...
- 计算机文化基础教程教案,新版《计算机文化基础》教案.doc
- 关于在真实物理机器上用cloudermanger或ambari搭建大数据集群注意事项总结、经验和感悟心得(图文详解)...
- JAVA Swing——设置JButton按钮样式
- 关于凸优化的一些简单概念
- Mysql 8 逻辑升级详解
- 使用Apache Drill深入研究当今的大数据
- linux启动java命令
- 如何在电脑上彻底删除Oracle客户端?
- android studio海马玩模拟器
- OpenJ_Bailian - 4104 G - 单词翻转
- C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致。
- 网络流行语2016_“云”作为流行语
- 趋势指标(一)MACD指标
- imoo c1语言设置在哪里,不再被“辣眼睛”!imoo C1 护眼功能解析
- OA与BPM究竟有啥区别
- java实现中文汉字转中文全拼和拼音首字母缩写的方法
- PE启动菜单修改工具 MsgDiyer(GfxMenu Message制作工具) V2.0.3官方版
- JRDZ静态中间继电器