
TCP/IP
猪哥-嵌入式
这个作者很懒,什么都没留下…
展开
-
LwIP系列(6):TCP client 连接服务器3次握手代码流程简单分析
在上一篇文章中,我们详细描述了TCP 3次握手、4次挥手、状态机转换,本文从lwip的代码维度,分析下tcp client的发起连接的流程,之所以单独分析tcp client,是因为嵌入式设备,client使用场景较多。原创 2023-08-15 22:34:38 · 731 阅读 · 0 评论 -
LwIP系列(2):动态内存池管理(memp.c)详细分析
我们在学习Lwip源码时,内存管理是绕不开的一个重点,我们在看相关的代码时,经常会看到和, 其中:(1)memp_malloc是从内存池中申请内存,具体实现在memp.c + memp.h。(2)mem_malloc则是从中申请内存,具体实现在mem.c + mem.h中。这两个API的区分也很容易,“p”是pool的简称,所以memp代表从内存池,mem是从内存堆。原创 2023-06-18 11:58:45 · 2009 阅读 · 0 评论 -
socket编程tcp server 示例2:多client,单线程轮询
前言在上一篇文章中,采用select的方式,通过存储client数组存放client fd,实现了tcp server,文本参考libmodbus 中modbus tcp server的思路,相当于对上一篇文章的优化,不需要使用client数组,通过轮询就能实现多client连接。代码#define NB_CONNECTION 5static modbus_t *ctx = NULL;static modbus_mapping_t *mb_mapping;static int serv原创 2021-02-19 10:50:24 · 874 阅读 · 0 评论 -
socket编程tcp server 示例1:多client,单线程,固定client数
前言编写tcp server有很多种思路,本示例采用unix网络编程中的,单线程,多client,通过固定client数量来实现。代码逻辑socket(....)bind(...)listen()client[]初始化FD_ZERO()FD_SET()while(1){ rc = select(....); if(rc == 新客户端连接){ accept(...) 存储新client socket fd } if(rset == client){ 读取客户端发送的ms原创 2021-02-19 10:36:21 · 822 阅读 · 0 评论 -
INADDR_ANY和127.0.0.1
背景在编写tcp server程序时,涉及到server 的IP绑定,经常能看到127.0.0.1 还有 INADDR_ANY,这两者还是有很大的区别的,尤其是通过另外一台设备上tcp client去连接server时,如果设置为127.0.0.1,将会连接失败。127.0.0.1这个地址通常分配给loopback接口,loopback是一个特殊的网络IP,可以理解为虚拟网卡,用于本机中各个应用之间的网络交互,只要操作系统网络组建正常,loopback就能工作。所以这里需要明白使用127.0.0.1进原创 2021-02-18 16:09:15 · 1863 阅读 · 0 评论 -
socket编程——服务器异常对客户端的影响
我们在编写socket客户端程序时,必须要提前考虑 服务器异常 时的应对措施,服务器的动作主要有3种:(1)服务器正常,返回给客户端正常数据,也就是正常的数据业务,那么客户端的套接字变为可读,并且read返回一个大于0的值(即读入数据的字节数)。(2)服务器正常终止,给客户端发送FIN,那么客户端的套接字变为可读,并且read返回0(EOF)。(3)服务器崩溃,包括崩溃...原创 2019-04-24 16:35:11 · 912 阅读 · 0 评论 -
socket编程——进一步理解accept函数
在前面的文章《TCP套接字编程--常用函数小结》中,我们分析了socket的常用函数,其他的函数,我们还比较容易理解,但是accept函数的意义容易被忽略。我们来总结下使用要点:1)accept函数负责从客户端“连接”的队列中返回一个最近的新连接。2)accept只负责“接客”,不干别的,不是用于接收数据的,接收数据是通过read函数实现的,accept正常返回,就代表有新客户端连...原创 2019-04-19 15:07:29 · 6811 阅读 · 1 评论 -
socket编程——深入理解“单进程通过select实现并发”
在前面的文章《socket编程——服务器并发》中,我们看到服务器的并发可以简单的通过fork 子进程来实现,这种方式比较方便,但是也有些缺点,就是相对开销 比较大,当然了,这里说的也只是相对开销大,毕竟现在的处理器功能相对强大。在实际的工程项目中,还有一种方式,就是结合select机制,也可以实现 单进程下服务器的并发,这个是充分的使用了select函数的强大功能,关于select可以参...原创 2019-04-19 14:42:52 · 1769 阅读 · 0 评论 -
socket编程——tcp客户端实现框架对比分析
在宝书《Unix网络编程》中,作者针对客户端提出了大概5种编程框架,分别如下:(1)停-等方式。(2)select加阻塞式IO版本。(3)非阻塞IO版本。(4)多进程fork版本。(5)多线程版本。在16.2.2小节中,对比总结了这几种方式,作者推荐的方式是:推荐使用 多进程fork版本。我们来整理,并简单分析一下这几种版本的编程框架。一、停-等(迭代)方式示例代...原创 2019-04-28 10:31:41 · 912 阅读 · 0 评论 -
TCP套接字编程--常用函数小结
使用套接字进行TCP应用编程十分 方便,因为Unix/Linux的设计是清晰分层的,应用层只需要使用套接字的接口API函数,具体的实现是由内核来做的,而内核只负责底层 实现,并不关心应用层逻辑,好处多多,下面就分析小结下TCP套接字的常用函数:1. socket 函数 为了进行网络I/O,第一件事情就是调用socket函数。 原型:#include <sy...原创 2019-04-15 11:25:46 · 1107 阅读 · 0 评论 -
socket编程——服务器并发
前言,本文引用了《Unix网络编程》,向作者致以 崇高的敬意。 在前面的文章《 socket编程——TCP server编程框架分析》中,我们分析了一个典型的tcp server案例。真正使用的时候,服务器并发是经常遇到的。只能响应一个客户端的服务器叫迭代服务器,能同时 响应多个客户端访问的叫并发 服务器,服务器并发的实现要么是通过 多线程(比如JAVA的线程池)、要么是多进程,而《Un...原创 2019-04-17 20:56:09 · 922 阅读 · 0 评论 -
socket编程——常用数据结构及头文件分析
1、IPv4套接字地址结构 sockaddr_in,对应头文件 <netinet/in.h>struct in_addr{ in_addr_t s_addr; //32bit 的IPv4地址};struct sockaddr_in{ uint8_t sin_len; //结构体长度,大小 sa_famil...原创 2019-04-17 15:11:19 · 1743 阅读 · 0 评论 -
socket编程——TCP server编程框架分析
在上一篇文章 《TCP套接字编程--常用函数小结》我们分析了套接字编程的一些常用函数,本文基于这些文章,结合一个TCP server服务程序进一步分析一下socket编程。程序框架如下:#include <sys/socket.h>#include <stdio.h>#include <stdin.h>#include <unistd....原创 2019-04-17 11:01:34 · 830 阅读 · 0 评论 -
以太网、IP、TCP、HTTP协议概述
以下内容转自:http://www.ruanyifeng.com/blog/2017/06/tcp-protocol.html 这个老师讲的很好,言简意赅。一、以太网是最底层的协议,规定了电子信号如何组成数据包(packet),解决了子网内部的点对点通信。(图片说明:以太网协议解决了局域网的点对点通信。) 二、IP协议(internet protocol) 以太网的...转载 2018-10-24 22:50:19 · 10299 阅读 · 0 评论