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相关推荐

  1. Linux数据报文接收发送总结6

    2.3 协议栈注册 内核实现了网络层的ip协议,也实现了传输层的tcp协议和udp协议.这些协议对应的实现函数分别是ip_rcv(),tcp_v4_rcv()和udp_rcv().和我们平时写代码的方 ...

  2. Linux数据报文接收发送总结5

    2.2 网络子系统初始化 linux内核通过调用subsys_initcall来初始化各个子系统,在源代码目录里你可以grep出许多对这个函数的调用.这里我们要说的是网络子系统的初始化,会执行到net ...

  3. Linux数据报文接收发送总结4

    二.系统初始化 Linux驱动,内核协议栈等等模块在具备接收网卡数据包之前,要做很多的准备工作才行.比如要提前创建好ksoftirqd内核线程,要注册好各个协议对应的处理函数,网络设备子系统要提前初始 ...

  4. Linux数据报文接收发送总结3

    1.3 协议分层 大概了解了网卡驱动.硬中断.软中断和ksoftirqd线程之后,我们在这几个概念的基础上给出一个内核收包的路径示意: 当网卡上收到数据以后,Linux中第一个工作的模块是网络驱动.网 ...

  5. Linux数据报文接收发送总结2

    1. 准备工作 此处重点介绍基础概念,为后面介绍数据包收发打下基础.本次代码层面基于Linux 4.4 Kernel. 1.1 系统调用 Linux的系统运行分为用户态和内核态,内核态控制着系统资源. ...

  6. Linux数据报文接收发送总结7

    2.4 网卡驱动初始化 每一个驱动程序(不仅仅只是网卡驱动)会使用 module_init 向内核注册一个初始化函数,当驱动被加载时,内核会调用这个函数.比如igb网卡驱动的代码位于drivers/n ...

  7. linux网络报文接收发送浅析_Docker容器网络-基础篇

    Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/Netfilter.网桥.路由等.接下来, ...

  8. Linux SYN报文接收及发送SYNACK报文

    注:本文分析基于3.10.0-693.el7内核版本,即CentOS 7.4 在分析connect()系统调用时,我们已经发送SYN报文,所以服务端就需要作出回应了.我们依然只分析TCP层的操作.SY ...

  9. linux IPv4报文处理浅析

    在<linux网络报文接收发送浅析>一文中介绍了数据链路层关于网络报文的处理. 对于接收到的报文,如果不被丢弃.不被网桥转发,会调用netif_receive_skb()提交给IP层: 而 ...

最新文章

  1. HDU - 6486 Flower(思维)
  2. python爬取公众号历史文章_python爬微信公众号前10篇历史文章(6)-话说http cookies...
  3. 计算机文化基础教程教案,新版《计算机文化基础》教案.doc
  4. 关于在真实物理机器上用cloudermanger或ambari搭建大数据集群注意事项总结、经验和感悟心得(图文详解)...
  5. JAVA Swing——设置JButton按钮样式
  6. 关于凸优化的一些简单概念
  7. Mysql 8 逻辑升级详解
  8. 使用Apache Drill深入研究当今的大数据
  9. linux启动java命令
  10. 如何在电脑上彻底删除Oracle客户端?
  11. android studio海马玩模拟器
  12. OpenJ_Bailian - 4104 G - 单词翻转
  13. C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致。
  14. 网络流行语2016_“云”作为流行语
  15. 趋势指标(一)MACD指标
  16. imoo c1语言设置在哪里,不再被“辣眼睛”!imoo C1 护眼功能解析
  17. OA与BPM究竟有啥区别
  18. java实现中文汉字转中文全拼和拼音首字母缩写的方法
  19. PE启动菜单修改工具 MsgDiyer(GfxMenu Message制作工具) V2.0.3官方版
  20. JRDZ静态中间继电器

热门文章

  1. Android AsyncTask
  2. pku 3436 ACM Computer Factory ——最大流 EK
  3. 允许修改 SharePoint2010 中的电子邮件
  4. [Java] grails 安装手记
  5. 动态CSS - LESS学习总结
  6. 第四周课程总结及实验报告
  7. ecshop 整合 QQ登陆 和 支付宝快捷登陆代码
  8. 340. 通信线路(分层图最短路)
  9. QT+OPENCV实现录屏功能
  10. 在docker镜像中加入环境变量