二、UDP 编程流程 1.服务器 代码如下(示例): int main() { int sockfd = socket(AF_INET,SOCK_DGRAM,0); assert( sockfd...sockaddr*)&caddr,sizeof(caddr)); } close(sockfd); exit(0); } 2.客户端 代码如下(示例): int main() { int sockfd = socket
为了解决这些不同地址格式的兼容性问题,套接字提供了一个通用的地址结构体 sockaddr,用于统一处理不同的地址结构。...这样只要取得某种 sockaddr 结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容 socket API 可以都用 stsockaddr...总的来说 通过 sockaddr 结构体,Socket API 实现了网络通信和本地通信的统一接口 它的设计理念类似于“多态”,即通过一个通用的接口来处理多种类型的地址格式 7....参数: socket:套接字文件描述符。 address:存储地址和端口号的结构体指针。 address_len:地址结构体的长度。...参数: socket:监听套接字。 address:存储客户端的地址信息。 address_len:地址结构的长度。
addrlen: 这是一个指向 socklen_t(POSIX)或 int(Windows)的指针,表示 addr 结构体的大小。...在调用 accept 之前,需要将其初始化为 addr 结构体的大小。 调用完成后,addrlen 会被设置为实际存储的地址信息的长度。...accept() 函数时,需要让 socklen_t peerlen = sizeof(peer); 这一行代码的作用是为 peerlen 变量赋初值,表示 struct sockaddr_in peer 结构体的大小...EchoServer -- 多线程 ThreadData 结构体如下: ThreadEntry 函数如下: 结果如下: 5....EchoServer -- 线程池 引入我们之前写的【Linux】:线程库 Thread.hpp 简单封装 Thread.hpp 以及 单例模式下的【Linux】:日志策略 + 线程池(单例模式 Threadpool.hpp
linux socket的基础 linux的空间分为kernel space 和 user space, 比例是1:3 linux中一切皆文件, 所以用文件描述符来表示socket, 实际上是socket...用来进程与进程之间的通信 socket如何创建 一个进程要创建socket的流程如下所示 1....pathname, MY_SOCK_PATH should be deleted using unlink(2) or remove(3) */ } 如何在linux...上查看socket ll /proc//fd linux默认的三个文件描述符 0 - stdin 1 - stdout 2 - stderr >& 是重定向到文件描述符...基于socket的应用 java nio java nio用channel代替了输入输出流, 这个channel, 就是socket 其原理是使用了linux kernel里的fcntl /*
创建socket _sockfd = ::socket(AF_INET, SOCK_DGRAM, 0); if (_sockfd < 0) {...LOG(LogLevel::FATAL) socket: " << strerror(errno); Die(SOCKET_ERR); }...LOG(LogLevel::FATAL) socket: " << strerror(errno); Die(SOCKET_ERR); }...创建socket sockfd = ::socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { std::cerr socket socket // client必须也要有自己的ip和端口!但是客户端,不需要自己显示的调用bind!!
在前面几篇文章中,我们实现了Socket编程,也就是基于UDP和TCP进行了网络编程,通过这几次编程我们已经熟悉了Socket编程相关的系统调用,那么这篇文章我们就来使用模版方法模式封装一个Socket...模版方法模式 模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将某些步骤延迟到子类中实现,从而在不改变算法结构的情况下允许子类重新定义特定步骤。...核心结构 抽象类(Abstract Class):定义算法的框架(模板方法),并声明若干抽象方法或虚方法供子类实现。模板方法通常被声明为final以防止子类重写算法结构。...注意事项 模板方法应声明为非虚函数(如使用 final 或非虚函数),以保持算法结构稳定。 抽象方法(如 brew())应声明为 protected,限制外部直接调用。...服务端 封装好之后就是使用封装的Socket来实现服务端,我们已经实现过了,这里就不再介绍了,只需要将原先的原生系统调用换成封装的Socket即可 #pragma once #include "Socket.hpp
TCP socket API 详解 下面介绍程序中用到的 socket API,这些函数都在 sys/socket.h 中。...socket() 作用:打开一个网络通讯端口,如果成功的话,就像 open()一样返回一个文件描述符; 应用程序可以像读写文件一样用 read/write 在网络上收发数据; 返回值:如果 socket...,而它们的长度各不相同,所以需要第三个参数 addrlen指定结构体的长度;我们的程序中对 myaddr 参数是这样初始化的: 1....将整个结构体清零; 2. 设置地址类型为 AF_INET; 3....(有可能没有占满调用者提供的缓冲区); 我们的服务器程序结构是这样的: 返回值:sockfd用来进行通信 connect() 介绍:客户端需要调用 connect()连接服务器; 参数:connect
结构,其中指定address family时一般设置为AF_INET,即使用IP。...0 socket描述符是一个指向内部数据结构的指针,执行描述符表的入口 两个网络程式之间的一个网络连接包括:通信协议、本地协议地址、本地主机端口、远端主机地址、远端协议端口 socket... struct in_addr sin_addr; // ip地址 unsigned char sin_zero[8]; // 填充0以保证和struct sockaddr同样大小 } 第二个结构体更常用...,用bzero()或memset()函数将其该结构体置为零 指向sockaddr_in的指针和指向sockaddr的指针能够相互转换 my_addr.sin_port = 0; // 表示随机获取一个没有被占用的端口号...函数返回的socket描述符 serv_addr: 包含远端主机ip地址和端口号的指针 addrlen: 为远端地址结构的长度, sizeof(sockaddr) connect
如果对你有帮助,麻烦点个在看或点个赞,感谢~ 不管是Qt开发还是linux 嵌入式应用开发,一个人的核心竞争力还是不断思考,也就是不断琢磨。...下面的程序主要是Linux C Socket 读取JSON文件并传输,然后再写入文件,其中使用了cJSON库,关于cJSON库不过多介绍,主要介绍整体的思路。 1....Server 端 使用的是socket 阻塞式,没有使用select、poll、epoll等 接收端按照JSON格式解析数据,并提取感兴趣Key所对应的Value 程序功能挺快就可以做好,做完之后进行拆解...,将socket通信独立出来,JSON解析、写文件、响应客户端JSON数据等分别写成函数。...小结 编译JSON时需要链接linux的数学库 自己琢磨如何拆解函数功能 应用程序也主要是调用别人的api,那么你的核心竞争力是什么呢 ? 如需程序工程可在公众号后台留言。
前言 在上一篇文章里面我们介绍了TCP的三次握手和四次挥手过程的介绍以及网络编程里面的一些api接口函数的介绍——Linux系统下socket编程之socket接口介绍(一)。...(这个转换完后不能用于网络传输,还需要调用htons或htonl函数才能将主机字节顺序转化为网络字节顺序,这两个函数先不讲,实战遇到的话,再进行解析),具体可以看下面Linux的源文: inet_aton...地址的表达格式通常是ASCII字符串,数值格式则是存放到套接字地址结构的二进制值。...- 表示IP地址相关数据结构 - (1)上面的一些函数参数里面用到的结构体(比如bind函数参数里的const struct sockaddr *addr等)都定义在 netinet/in....(2)struct sockaddr,这个结构体是linux的网络编程接口中用来表示IP地址的 标准结构体,bind、connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的。
在上述内容中笔者通过一个简单的案例给大家介绍了在套接字编程中如何传递结构体数据,本章将继续延申结构体传输,在某些时候例如我们需要传输一些当前系统的进程列表信息,或者是当前主机中的目录文件,此时就需要使用循环结构体传输功能...,循环传输结构体的关键点在于,客户端发送结构体数据之前需要通过一次通信来告诉服务端需要接收的次数,当服务端接收到次数时则可利用接收计数器依次循环接收数据直到客户端完整所有数据包的发送。...14.7.1 服务端实现多条结构体的传输方式与单条从原理上一致,只是多条结构体在传输时需要提前告知服务端我需要分几次将结构体传输给对方,因为数据包最大单次可发送8192字节,所以如果结构过多则需要分批次进行传输...sock; WSAStartup(MAKEWORD(2, 0), &WSAData); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET...sock; WSAStartup(MAKEWORD(2, 0), &WSAData); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET
当在套接字编程中传输结构体时,可以将结构体序列化为字符串(即把结构体的所有成员打包成一个字符串),然后将字符串通过套接字传输到对端,接收方可以将字符串解析为结构体,然后使用其中的成员数据。...sock; WSAStartup(MAKEWORD(2, 0), &WSAData); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET...) { std::cout SOCKET msgsock; // 用于接收结构 char recv_buf[4096] = { 0 }...= INVALID_SOCKET) { recv(msgsock, recv_buf, sizeof(recv_buf), 0); // 接收到结构,强制类型转换 message*...sock; WSAStartup(MAKEWORD(2, 0), &WSAData); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET
在前面的文件中,我们介绍了linux网络编程中与IP相关的知识和常用的函数总结,本文针对具体的UDP通信,来详细的介绍UDP通信的使用,包括UDP通信中的点对点通信,多播,广播等。...IP_MULTICAST_IF:设置组播的默认默认网络接口,会从给定的网络接口发送,另一个网络接口会忽略此数据 选项IP_ADD_MEMBERSHIP和IP_DROP_MEMBERSHIP:加入或者退出一个组播组其参数为一个结构体...后,配置一下套接字,允许进行发送广播消息,上代码 int set_broadcast = 1; setsockopt(socket, SOL_SOCKET, SO_BROADCAST, &set_broadcast...解决方法如下:(允许端口重用) int on = 1; ret = setsockopt(udp_net_sta.socket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof...(int)); if (ret < 0) { perror("socket set SO_REUSEADDR failed"); } 2、服务端程序,在创建完socket后,有一个bind的操作
个人主页:island1314 个人专栏:Linux—登神长阶 1....这样只要取得某种 sockaddr 结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容 socket API 可以都用 stsockaddr* 类型表示...总的来说 通过 sockaddr 结构体,Socket API 实现了网络通信和本地通信的统一接口 它的设计理念类似于“多态”,即通过一个通用的接口来处理多种类型的地址格式 7....参数: socket:套接字文件描述符。 address:存储地址和端口号的结构体指针。 address_len:地址结构体的长度。...参数: socket:监听套接字。 address:存储客户端的地址信息。 address_len:地址结构的长度。
Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统。...Socket是什么 1、 socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –>...操作系统把该描述符作为索引访问进程描述符表,通过指针找到保存该文件所有的信息的数据结构。 针对套接字的系统数据结构: 1)、套接字API里有个函数socket,它就是用来创建一个套接字。...文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。...具体如何实现,可以看看linux的内核 4.1、socket()函数 int socket(int protofamily, int type, int protocol);//返回sockfd
套接字描述符 首先会先到的是文件描述符,对Linux一切皆文件的哲学又多懂了一点儿点儿。 套接字是通信端点的抽象。与应用程序使用文件描述符一样,访问套接字需要使用套接字描述符。...Linux系统是小端字节序。 2.2 地址格式 地址确定了特定通信域中的套接字端点,地址格式与特定的通信域相关。...为使不同格式的地址能够被传入到套接字函数,地址被强转换成通用的地址结构sockaddr表示。...注意:linux的man命令可以查看api的详细说明,而且还有例子,也挺不错的。 4....Linux Socket Server 与 Client 例子 个人觉得这只是套接字的入门,如果一个服务器要连接多个客户端呢?以后有机会和大家一起分享下select的套接字用法。
编程基础 1、调用接口 (一)创建描述符 #include socket.h> int socket(int domain, int type, int protocol); 返回值:成功返回套接字描述符...addrlen:这是 addr 所指向结构体的长度,通常使用 sizeof 运算符来获取,这里位输入型参数 (三)监听套接字 #include socket.h> int listen(int...,并且在函数返回时,该指针指向的值会被更新为实际存储的客户端地址信息的长度,这里是输入输出型参数 (五)建立连接 #include socket.h> int connect(int sockfd...socklen_t addrlen); 返回值:成功返回0,失败返回-1 sockfd:要连接的套接字描述符 addr:存储了要连接的服务器的地址信息 addrlen:表示 addr 所指向的地址结构体的长度...,通常使用 sizeof 运算符来获取,输入型参数 2、sockaddr的结构 sockaddr的结构如下图左一所示,实际上,我们在函数中用到的结构体是右边两个而不是左一,在sockaddr接受传来的参数时
_ip = ipbuffer; } //参数是ip和端口,初始化的是ip结构体!!!!...创建socket int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0) { std::cerr...socket error" << std::endl; exit(SOCKET_ERR); } // 2. bind吗??...{ LOG(LogLevel::FATAL) socket error"; exit(SOCKET_ERR); }...设置socket状态为listen-------比udp多了一条设置listen状态!!!!
: 在讲解这个之前,你得必须要明白在Linux系统下,一切皆是文件,(举个简单的例子,一般我们在Windows系统下,你是可以清楚的看到硬盘盘符,并标有大小的,可以直接用鼠标拖拉文件到里面去;而在Linux...Since Linux 2.6.27, the type argument serves a second purpose: in addition to specifying a socket type...下面我们来看一下在Linux系统下它的原型: BIND(2) Linux Programmer's Manual...下面是他函数原型: LISTEN(2) Linux Programmer's...我们来看一下它的原型: ACCEPT(2) Linux Programmer's
、 4.socket编程接口 // 创建 socket ⽂件描述符 (TCP/UDP, 客⼾端 + 服务器) int socket(int domain, int type, int protocol..., const struct sockaddr *addr, socklen_t addrlen); sockaddr结构: 这几种结构体都会作为上述函数的参数-----------------即*...(需要从外部得到ip和port) 详细解释sockaddr_in结构: 正好对应着 16位地址类型,16位端口号,32位IP地址!!!!--------填充位不考虑!!...绑定socket信息,ip和端口, ip(比较特殊,后续解释) // 2.1 填充sockaddr_in结构体 struct sockaddr_in local;//结构体...每一个进程都要有自己的structaddr结构体,存储自己的IP地址和ip地址类型,和struct file 一致 ---------------建立之后要把该结构体和socket的fd描述符使用bind