TCP/IP/Socket
文章平均质量分 53
TCP/IP 、Socket、TCP、UDP、SSL
River-D
知之者不如好之者,好之者不如乐之者。
展开
-
socket之getaddrinfo()函数
socket编程之addrinfo结构体与getaddrinfo函数1. 概述IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间。IPv6中引入了getaddrinfo()的新API,它是协议无关的,既可用于IPv4也可用于IPv6。getaddrinfo函数能够处理名字到地址以及服务到端口这两种转换,返回的是一个addrinfo的结构(列表)指针而不是一个地址清单。这些a原创 2022-03-25 16:27:53 · 1669 阅读 · 0 评论 -
socket之gethostbyname()函数
gethostbyname()函数说明——用域名或主机名获取IP地址 包含头文件 #include <netdb.h> #include <sys/socket.h> 函数原型 struct hostent *gethostbyname(const char *name); 这个函数的传入值是域名或者主机名,例如"www.google.cn"等等。传出值,是一个hostent的结构。如果函数调用失败,将返回NULL。 返回原创 2022-03-25 15:24:47 · 4672 阅读 · 0 评论 -
socket编程之sockaddr和sockaddr_in的区别
sockaddr和sockaddr_in的区别struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。在各种系统调用或者函数中,只要和网络地址打交道,就得用到这两个结构体。网络中的地址包含3个方面的属性:1 地址类型: ipv4还是ipv62 ip地址3 端口相应的,头文件有如下定义:include <netinet/in.h>struct sockaddr { unsigned short sa_family;原创 2022-03-25 11:07:06 · 1328 阅读 · 0 评论 -
TCP/IP协议栈
TCP/IP协议栈之LwIP(零)— LwIP开发调试环境搭建(一)— 网络数据包管理(二)—网络接口管理(三)—网际寻址与路由(IPv4 + ARP + IPv6)(四)—网络诊断与状态查询(ICMPv4 + ICMPv6)(五)—网络传输管理之UDP协议(六)—网络传输管理之TCP协议(七)—内核定时事件管理(八)—Raw/Callbck API编程(九)—Sequetia API编程####(十)—Socket API编程(十一)—原创 2022-01-19 16:29:06 · 1549 阅读 · 0 评论 -
Linux 网络编程
Socket编程实践(1) 基本概念Socket编程实践(2) Socket API 与 简单例程Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程Socket编程(4)TCP粘包问题及解决方案原创 2020-10-09 15:15:11 · 102 阅读 · 0 评论 -
基于UDP的服务器端和客户端
1、UDP中的服务器端和客户端没有连接。2、UDP服务器端和客户端均只需1个套接字。基于UDP的接收和发送函数发送数据使用 sendto() 函数:ssize_t sendto(int sock, void *buf, size_t nbytes, int flags, struct sockaddr *to, socklen_t addrlen); //Linuxint sendto(SOCKET sock, const char *buf, int nbytes, int flags, co原创 2020-09-04 17:26:59 · 228 阅读 · 0 评论 -
UDP和TCP比较
1、TCP 是面向连接的传输协议,建立连接时要经过三次握手,断开连接时要经过四次握手,中间传输数据时也要回复 ACK 包确认,多种机制保证了数据能够正确到达,不会丢失或出错。UDP 是非连接的传输协议,没有建立连接和断开连接的过程,它只是简单地把数据丢到网络中,也不需要 ACK 包确认。2、如果只考虑可靠性,TCP 的确比 UDP 好。但 UDP 在结构上比 TCP 更加简洁,不会发送 ACK 的应答消息,也不会给数据包分配 Seq 序号,所以 UDP 的传输效率有时会比 TCP 高出很多,编程中实现原创 2020-09-03 17:07:02 · 253 阅读 · 0 评论 -
TCP四次握手断开连接
建立连接需要三次握手,断开连接需要四次握手,可以形象的比喻为下面的对话:[Shake 1] 套接字A:“任务处理完毕,我希望断开连接。”[Shake 2] 套接字B:“哦,是吗?请稍等,我准备一下。”等待片刻后……[Shake 3] 套接字B:“我准备好了,可以断开连接了。”[Shake 4] 套接字A:“好的,谢谢合作。”下图演示了客户端主动断开连接的场景:建立连接后,客户端和服务器都处于ESTABLISED状态。这时,客户端发起断开连接的请求:客户端调用 close() 函数后,向服原创 2020-09-03 17:02:29 · 133 阅读 · 0 评论 -
TCP数据的传输过程
图1:TCP 套接字的数据交换过程上图给出了主机A分2次(分2个数据包)向主机B传递200字节的过程。首先,主机A通过1个数据包发送100个字节的数据,数据包的 Seq 号设置为 1200。主机B为了确认这一点,向主机A发送 ACK 包,并将 Ack 号设置为 1301。为了保证数据准确到达,目标机器在收到数据包(包括SYN包、FIN包、普通数据包等)包后必须立即回传ACK包,这样发送方才能确认数据传输成功。此时 Ack 号为 1301 而不是 1201,原因在于 Ack 号的增量为传输的数据字节数.原创 2020-09-03 16:53:21 · 412 阅读 · 0 评论 -
TCP数据报结构以及三次握手
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)。可以形象的比喻为下面的对话:[Shake 1] 套接字A:“你好,套接字B,我这里有数据原创 2020-09-03 16:42:10 · 127 阅读 · 0 评论 -
TCP协议的粘包问题(数据的无边界性)
数据的接收和发送是无关的,read()/recv() 函数不管数据发送了多少次,都会尽可能多的接收数据。也就是说,read()/recv() 和 write()/send() 的执行次数可能不同。例如,write()/send() 重复执行三次,每次都发送字符串"abc",那么目标机器上的 read()/recv() 可能分三次接收,每次都接收"abc";也可能分两次接收,第一次接收"abcab",第二次接收"cabc";也可能一次就接收到字符串"abcabcabc"。这就是数据的“粘包”问题,客户端发原创 2020-09-03 16:30:11 · 128 阅读 · 0 评论 -
socket缓冲区以及阻塞模式
socket缓冲区每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决原创 2020-09-03 16:22:11 · 901 阅读 · 0 评论 -
socket 函数
socket() 函数Linux 下的 socket() 函数在 Linux 下使用 <sys/socket.h> 头文件中 socket() 函数来创建套接字,原型为:int socket(int af, int type, int protocol);af 为地址族(Address Family),也就是 IP 地址类型,常用的有 AF_INET 和 AF_INET6。AF 是“Address Family”的简写,INET是“Inetnet”的简写。AF_INET 表示 IP原创 2020-09-03 11:53:47 · 227 阅读 · 1 评论 -
Linux下的socket演示程序
服务器端代码 server.cpp:#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <arpa/inet.h>#include <sys/socket.h>#include <netinet/in.h>int main(){ //创建套接字 参数 AF_INET 表示使用 IPv4原创 2020-09-03 10:57:14 · 220 阅读 · 0 评论 -
OSI网络七层模型
OSI 模型把网络通信的工作分为 7 层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。OSI 只是存在于概念和理论上的一种模型,它的缺点是分层太多,增加了网络工作的复杂性,所以没有大规模应用。后来人们对 OSI 进行了简化,合并了一些层,最终只保留了 4 层,从下到上分别是接口层、网络层、传输层和应用层,这就是大名鼎鼎的 TCP/IP 模型。...原创 2020-09-01 15:57:22 · 858 阅读 · 0 评论 -
TCP/IP 错误原因码 (errno) 各种异常现象和分析
理解 TCPhttps://segmentfault.com/blog/iamjerrycTCP/IP 某些最常见的错误原因码 (errno)列表(转)https://www.cnblogs.com/qq78292959/archive/2013/04/22/3036103.html从TCP协议到TCP通信的各种异常现象和分析(上)https://network.51cto.com/ar...原创 2019-12-26 17:08:30 · 6268 阅读 · 0 评论 -
socket errno
关于错误errno EFAULT:Bad addresshttps://blog.csdn.net/vonzhoufz/article/details/39049043原创 2019-11-14 14:52:13 · 261 阅读 · 0 评论 -
socket recv阻塞与非阻塞error总结
recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。 首先阻塞接收的recv有时候会返回0,这仅在对端已经关闭TCP连接时才会发生。 而当拔掉设备网线的时候,recv并不会发生变化,仍然阻塞,如果在这个拔网线阶段,socket被关掉了,后果可能就...转载 2018-03-29 15:23:02 · 3619 阅读 · 1 评论