linux网络编程之Socket编程

(1)socket套接字

             1)在linux环境下,socket用于表示进程间网络通信的特殊文件类型,其本质是内核借助缓冲区形成的伪文件(不占磁盘空间,除此之外还有二进制文件,管道,字符文件)。

             2)伪文件也可以像文件一样的操作(读写),区别在于管道用于本地进程间的通信套接字多用于网络进程间数据的传递。 

             3)在TCP/IP协议中,IP地址可以在网络环境中唯一标识一个主机,端口号则在主机中唯一标识一个进程。因此在网络中,IP地址+端口号就对应一个socket

             4)在网络通信中,套接字一定成对存在。一段的发送缓冲区对应对端的接收缓冲区,使用同一个文件描述符可以操作发送缓冲区和接收缓存区。(全双工,文件描述符一个,数据缓存区两个

(2)网络字节序

              1)大端字节序:低地址高位、高地址低位

                    小端字节序:低地址低位,高地址高位(windows)

             2)网络数据流地址规定:先发出的数据是低地址,后发出的数据是高地址。

                   TCP/IP协议规定,网络数据流采用大端字节序,即低地址高字节。

             3)为了保证网络程序具有可移植性,需要调用库函数做网络字节序和主机字节序的转换。 

                            #include<arpa/inet.h>

                           uint32_t   htonl(uint32_t   hostlong);  //host to net long   IP

                           uint16_t   htons(uint16_t   hostshort);  //host to net short port 

                           uint32_t   ntohl(uint32_t   netlong); //net  to host  long  IP 

                           uint16_t   ntohl(uint16_t   netshort);  //net  to host  short port  

             如果主机是小端字节序,这些函数将参数做相应的大小端转换后返回。如果主机是大端字节序,则不做转换。

(3)IP地址转换

            1)通常我们所说的IP地址(如192.168.1.200),属于点分十进制形式,而我们在网络传输中通常使用到的是网络字节序形式,因此在传输的过程中,首先需要把点分十进制形式的字符串转换为网络字节序格式。

            2)IP地址转换函数

                      #include<arpa/inet.h>

                int    inet_pton(int af  ,const char *src, void *dst);//点分十进制字符串转换为网路字节序

               const  char *inet_ntop(int af, const void *src, char *dst, socklen_t size);//网络字节序转换为点分十进制

                参数:af(IP地址格式):AF_INET(IPV4)            AF_INET6(IPV6)

          3)sockaddr数据结构

            struct sockaddr诞生于IPV4协议时代,函数的接口通常使用(struct sockaddr),但是现在为了兼容IPV6,将struct sockaddr 改变成了struct sockaddr_t格式(因此现在定义变量时使用struct sockaddr_t,在传参数时使用struct sockaddr(不能直接用这个定义变量)

                                               

struct  sockaddr{                               struct sockaddr_in{                                                    struct in_addr{

          sa_family_t    sa_family;            _kernel_sa_family_t     sin_family;  //地址结构类型              _be32 s_addr;IP地址

          char  sa_data[14];                     _be16             sin_port;   //端口号                              };

};                                                             struct  in_addr  sin_addr;

                                                                                   ......

                                                                              };

 (4)Socket模型创建流程图

                 注:TCP客户端没有调用bind()函数绑定IP和端口号,系统会自动给它分配IP和端口号,但在TCP服务端则不能省去bind()函数。

         

(5)网络套接字函数

                   头文件:#include<sys/types.h>

                                   #include<sys/socket.h>

            1)打开一个网络通讯端口:socket函数(服务端、客户端)

                      int   socket(int domain, int type ,int protocol);

                     参数:domain:协议类型,AF_INET(IPV4)   AF_INET6(IPV6)     AF_UNIX(本地协议)

                                 type:SOCK_STREAM(流失协议,默认为TCP传输)       SOCK_DGRAM(报式协议,默认使用UDP传输)

                                 protocol:使用默认协议

                    返回值:成功返回新创建socket的文件描述符,失败返回-1.

         2)绑定IP和端口号:bind函数(服务端/客户端)

                       int   bind(int sockfd ,  const struct sockaddr *addr, socklen_t  addrlen);

               参数:sockfd : socket 文件描述符

                           addr:绑定了IP和端口号的结构体

                          addrlen:sizeof(addr)长度

              返回值:成功返回0,失败返回-1.

        3)指定监听上限数(同一时间允许多少客户端和服务器连接):listen函数(服务端)

              int   listen(int   sockfd,  int  backlog)

                   参数:backlog:排队进行三次握手队列和刚刚建立三次握手队列的链接数和。

                   返回值:成功返回0,失败返回-1

      4)接收连接请求:accept函数(服务端调用)

            int accept(int  sockfd,struct  sockaddr *addr,socklen_t *addrlen);

                  参数:addr(传出参数)返回链接客户端地址信息,含IP和端口号。

      5)连接客户端:connect函数(客户端调用)

            int   connect(int  sockfd,const struct *sockaddr,socklen_t addrlen)

                 参数:addr:传入参数,指定服务器的地址信息,含IP地址和端口号。

                             addrlen:sizeof(addr)大小

                返回值:成功返回0,失败返回-1.

 

                            addrlen(传入传出参数):传入sizeof(addr)大小,函数返回真正接收到的地址结构体的大小。

                返回值:生成一个新的socket文件描述符,用于和客户端通信,失败返回-1

(6) C/S模型之TCP:实现最简单的客户端、服务器程序

             服务器端:可通过命令nc  +自己ip +端口号完成自我通信(在不同进程使用)nc 182.168.1.100 6666

               

            客户端:

          

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux操作系统之简易实现server/client

1.首先将出错处理封装成函数&#xff0c;具体封装思想&#xff1a;是在底层函数的基础上将首字母大写&#xff08;方便在编程中查找函数文件的manpage,而不需要使用命令&#xff0c;直接用shiftk&#xff09;,然后调用底层库函数并考虑出错处理&#xff0c;具体函数如下&#x…

linux网络编程之TCP三次握手和四次挥手

1.在TCP连接的过程中&#xff0c;有三个阶段&#xff0c;分别是建立连接&#xff0c;传递数据和断开连接&#xff0c;通讯时序图如下所示: 2.结合TCP数据报格式分析建立连接的三次握手 1&#xff09;首先客户端发送一个带有SYN标志的TCP报文给服务器端&#xff0c;询问服务器端…

linux网路编程之多进程并发服务器

1&#xff09;使用多进程并发服务器考虑的因素&#xff1a; &#xff08;1&#xff09;父进程描述最大文件描述符的个数&#xff08;父进程需要关闭accept返回的新文件描述符&#xff09; &#xff08;2&#xff09;系统内可创建进程的个数&#xff08;与内存大小相关&#xff…

linux网路编程之多线程并发服务器

1&#xff09;在使用进程模型开发服务器过程中考虑以下问题 &#xff08;1&#xff09;调整进程内最大文件描述符上限 &#xff08;2&#xff09;线程如有共享&#xff0c;考虑线程同步 &#xff08;3&#xff09;客户端线程退出时&#xff0c;做退出处理&#xff08;线程分离&…

linux网路编程之TCP状态转换及端口复用

&#xff08;1&#xff09;TCP状态转换图 其中图中分为三种状态&#xff1a;实线代表的主动发起连接&#xff0c;虚线代表的被动发起连接&#xff0c;细实线代表的可以双向发起连接的状态。 主动发起连接方状态变化&#xff1a;1&#xff09;主动发起连接的一方发送SYN标志位&…

linux网络编程之多路I/o转接服务器select

(1)多路IO转接服务器也叫做多任务IO服务器&#xff0c;其主要思想是不再由程序自己监听客户端连接&#xff0c;取而代之的是由内核替应用程序监视文件&#xff0c;具体实现模型如图所示&#xff1a; 当客户端请求和服务器连接时&#xff0c;内核接收到连接指令&#xff0c;告诉…

linux网络编程之多路I/O转接服务器poll函数

&#xff08;1&#xff09;poll函数 头文件&#xff1a;#include<poll.h> int poll(struct pollfd*fds, nfds_t nfds,int timeout); struct pollffd{ int fd;//文件描述符 short events;//监控的事件 short revents;//监控事件中满足条件返回的事情 }&#xff1…

《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr

C Primer第二章的内容主要介绍了变量和基础类型&#xff0c;包括C语言定义的基础内置类型、变量的定义及声明、符合类型如指针及引用的介绍和const及常量表达式constexpr的介绍&#xff0c;本次博客也从这四个方面进行系统的介绍&#xff0c;如果有不足之处&#xff0c;还望其他…

793. 阶乘函数后K个零 golang

Me(AC 33 / 44 个通过测试用例) func preimageSizeFZF(K int) int {count : 0for i : 0; i < 1000000; i {if trailingZeroes(i) K {count}}fmt.Println(count)//fmt.Println(trailingZeroes(25))return count}func trailingZeroes(n int) int {if n 0 {return 0}return …

小程序radio单选框回显

话不多说&#xff0c;效果图如下&#xff1a; 具体代码如下&#xff1a; <radio-group name"radio" bindchange"getSex"><label><radio value"1" checked"{{xingbie1}}" />男</label><label><radio…

《C++ Primer 第五版》(第4.11节类型转换) ————关于无符号数和有符号数的运算探究

1.关于无符号数和有符号数的运算 关于无符号数和有符号数的运算&#xff0c;在我看来一直是觉得只要有无符号数和有符号数的运算&#xff0c;有符号数就转化为无符号数&#xff0c;但是在《C Primer 第五版》的p142介绍&#xff0c;关于无符号数和有符号数的运算如下规定的&…

543. 二叉树的直径 golang

文章目录543. 二叉树的直径example正确解法question代码&#xff08;wrong)543. 二叉树的直径 概要: 借鉴了这个题的代码。可是有一个测试用例过不去 https://blog.csdn.net/csdn_kou/article/details/104122067 example 给定一棵二叉树&#xff0c;你需要计算它的直径长度。一…

《C++ Primer 第五版》(第4.11-4.12节)——static_cast,const_cast和reinterpret_cast类型转换, 运算符优先级表

1.static_cast,const_cast和reinterpret_cast类型转换 static_cast:强制的类型转换(不能用于底层的const转换),以前C语言中的强制类型转换都可以使用static_cast来完成。如&#xff1a;int i3; double jstatic_cast<double>(i); const_cast&#xff1a;改变底层const(指针…

《C++ Primer 第五版》(第5.1-5.6节) ——异常处理机制(try语句块,throw表达式和catch异常捕捉处理单元)

1. 异常处理机制 C中使用try,throw和catch三个关键字来实现异常的触发、抛出和处理的功能&#xff0c;具体通用语法形式如下&#xff1a; try{ if(true) normal program-statements&#xff1b;//没有触发异常时候执行的代码 if(false) throw(exception); //出现错误&am…

283. 移动零golang

Me 遍历所有数组&#xff0c;统计0的个数倒着把零写入数组末尾 func moveZeroes(nums []int) {var count, j intfor _, key : range nums {if key 0 {count} else{nums[j] keyj}}for i:len(nums) - count; i < len(nums); i {nums[i] 0} }最优解(快慢指针) 减少了数组…

QT自定义MainWindow

1.开发环境&#xff1a;Qt 4.7.3 MinGW 32bit (MSVC2015 32bit) 2.实现大纲&#xff1a; 1&#xff09;自定义边框&#xff0c;标题栏&#xff0c;工具栏&#xff0c;内容栏&#xff0c;状态栏&#xff08;后面三个代码中没有实现实现&#xff09; 2&#xff09;重写鼠标事件…

QTextEdit实现图片和文本同行显示

1.开发环境&#xff1a;Qt 4.7.3 MinGW 32bit (MSVC2015 32bit) 2.实现大纲&#xff1a; 1&#xff09;实现图片和文本在同一行显示&#xff0c;且能够设置字体大小和颜色 2&#xff09;能够手动设置行的宽度和间距 3&#xff09;设置字体样式&#xff0c;然后添加图片&#…

QQuickWidget + QML编程实现酷炫动态动画效果

1.具体需求&#xff1a;当Qt开发项目中需要实现简单的动态酷炫动画效果时&#xff0c;我们可以使用Qt中的QQuickWidget来实现&#xff0c;同时还可以使用QML编程来实现具体的动画效果&#xff0c;具体实现的效果如下所示&#xff1a; 2.具体操作和实现效果图&#xff1a; 1&am…

Qt中的四种信号与槽的连接方式

1. UI界面右键点击控件&#xff0c;选择“转到槽“&#xff0c;系统会在cpp中自动添加这个组件对应的槽函数 2.在Ui界面的下面 siga如l & slot editor栏中手动添加 3.在代码中使用connect显示添加 4. 使用on_对象名_事件名隐式连接&#xff0c;以QPushButton为例 QPushBut…

解决QTreeWidget中item无法整行同时显示相同颜色

对于QTreeWidget来说&#xff0c;继承自QTreeView&#xff0c;因此设计QTreeWidget中的样式设计&#xff0c;归根结底是对QTreeView的样式设计&#xff0c;而对于QTreeView中item样式设计&#xff0c;可以分为对branch和item设计&#xff0c;另外QT Style Sheet可以通过设置sho…