一个简单的客户端与服务器通讯

合集下载

Python实现TCP文件传输

Python实现TCP文件传输

Python实现TCP文件传输TCP (Transmission Control Protocol) 是一种可靠的传输协议,常用于在网络上传输数据。

通过使用Python的内置socket库,可以轻松实现TCP文件传输。

在TCP文件传输过程中,需要一个服务器和一个客户端。

服务器负责接收文件,而客户端负责发送文件。

下面是一个简单的Python程序,实现了TCP文件传输的服务器端:```pythonimport socket#服务器IP地址和端口号SERVER_HOST='127.0.0.1'#一次接收的最大数据量BUFFER_SIZE=4096# 创建一个socket对象server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 将服务器socket对象绑定到指定的IP地址和端口号上server_socket.bind((SERVER_HOST, SERVER_PORT))# 使服务器socket对象监听传入的连接server_socket.listen(5)print(f"服务器正在监听地址 {SERVER_HOST}:{SERVER_PORT}...") #接受客户端连接client_socket, address = server_socket.acceptprint(f"来自地址 {address} 的连接已建立!")#接收客户端发送的文件名file_name = client_socket.recv(BUFFER_SIZE).decode#打开文件,准备写入file = open(file_name, 'wb')#开始接收文件数据并写入文件while True:data = client_socket.recv(BUFFER_SIZE)if not data:breakfile.write(data)# 关闭文件和socket连接file.closeclient_socket.closeserver_socket.closeprint("文件接收完毕!")```在以上代码中,我们首先创建了一个服务器socket对象,并将其绑定到指定的IP地址和端口号上。

应用程序之间互相通讯的几种方法

应用程序之间互相通讯的几种方法

应用程序之间互相通讯的几种方法应用程序之间的数据交换(互相通讯)一直是困扰广大程序员的难题,尽管已经出现了各式各样的解决方案,但迄今为止没有哪一种方案是完美无缺的。

因此,只有学习并了解了它们的优缺点后,才能在特定的情况下选择最佳方案,以满足最终的要求。

1、共享在硬盘上建立一个文件,一个应用程序往该文件里写数据(可以不关闭文件,但必须刷新缓冲区),另一个应用程序以共享方式打开这个文件并读取其中的内容,这便是最简单的一种数据交换方式。

对于网络用户而言,只要两台终端上安装的都是Win311 For Workgroup或Windows 95(或NT),则只要设置一下目录共享,映射成网络驱动器,同样可以简单地实现数据交换。

但它的缺点也是显而易见的:只能采取轮询的方式获得最新数据(效率低下),网络映射的驱动器绝对不能变动或取消(可靠性差),所以这是一种“低级”的通讯方式。

2、DDE每个Windows程序员都不会对DDE(动态数据交换)感到陌生,它是最早的基于Windows的数据交换方法,有三种方式可供选择:冷连接、温连接和热连接。

一般都是由客户端向服务器端发出连接申请,并且必须指明服务器端的名字和标题。

在连接建立后,数据可以双向流动。

典型的例子如抓图软件SnagIt,它提供了DDE接口,能够让其它应用程序来控制它。

DDE是完全向后兼容的,从16位平台转到32位,源代码几乎不用修改。

DDE还有网络功能。

使用过Win311 For Workgroup的人大概都还记得,它自带一个非常吸引人的小程序“Chat”,能使两台计算机通过网络实时交谈,这在当时几乎是一项创举。

可是很少有人知道“Chat”使用的是一种特殊的DDE,即NetDDE。

它的基本工作原理仍然是DDE,但它能使一台计算机向在同一个网络中的另一台终端发消息,而不像普通DDE 只能局限在同一台机器上。

与其它的数据交换方式相比,DDE已不够先进,而且Microsoft也不再积极支持DDE,所以它的前景不被看好。

C#基于TCP协议的服务器端和客户端通信编程的基础教程

C#基于TCP协议的服务器端和客户端通信编程的基础教程

C#基于TCP协议的服务器端和客户端通信编程的基础教程运⾏在TCP之上常见的⽹络应⽤协议有⽐如HTTP、FTP、SMTP、POP3、IMAP。

TCP是TCP/IP体系中最重要的传输协议,它提供全双⼯和可靠交付的服务,是⼤多数应⽤协议⼯作的基础。

TCP是⼀种⾯向连接(连接导向)的,可靠的,基于字节流的传输层通信协议。

TCP的⼯作过程建⽴连接传输数据连接的终⽌TCP的主要特点1.TCP是⾯向连接的协议2.是端到端的通信。

每个TCP连接只能有两个端点,⽽且只能⼀对⼀通信,不能点对多的的直接通信3.⾼可靠性4.全双⼯⽅式传输5.数据以字节流的⽅式传输6.传输的数据⽆消息边界关于线程利⽤TCP开发应⽤程序时,.net框架提供两种⼯作⽅式,⼀种是同步⼯作⽅式,另⼀种是异步⼯作⽅式。

同步⼯作⽅式是指利⽤TCP编写的程序执⾏到监听或者接收语句,在未完成当前⼯作前不再。

继续往下执⾏,线程处于阻塞状态,直到该语句完成后才能继续执⾏下⼀条语句。

异步⼯作⽅式是指程序执⾏到监听或者接收语句时,⽆论当前⼯作是否完成,都会继续往下执⾏。

TcpListener与TcpClient类常⽤⽅法与属性TCPListener类⽤于监听客户端连接请求,TCPClient类⽤于提供本地主机和远程主机的连接信息。

两个类都位于 .Socckets命名空间下。

1.TCPListener类常⽤的⽅法:(1)AcceptSocket:从端⼝处接收⼀个连接并赋予它Socket对象(2)AcceptTcpClient:从端⼝处接收⼀个连接并赋予它TCPClient对象(3)Equals:判断两个TcpListener对象是否相等(4)GetType:获取当前实例的类型(5)Pending :确定是否有挂起的连接请求(6)Start:开始接听传⼊的连接请求(7)Stop:关闭监听器(8)ToString:创建TcpListener对象的字符串表⽰2.TcpClient常⽤的属性与⽅法属性:(1)Client:获取或设置基础套接字(2)LingerState:获取或设置套接字保持连接的时间(3)NoDelay:获取或设置⼀个值,该值在发送或接收缓存冲未满时禁⽌延迟、(4)ReceiveBufferSize:获取或设置TCP接收缓存区的⼤⼩(5)ReceiveTimetut:获取或设置套接字接收数据的超时时间(6)SendBufferSize:获取或设置TCP发送缓存区的⼤⼩(7)SendTimeout:获取或设置套接字发送数据超时时间⽅法:(1)Close:释放TcpClient实例,⽽不关闭基础连接(2)Connect:⽤指定的主机名和端⼝号将客户端连接到TCP主机(3)BeginConnect:开始⼀个远程主机连接的异步请求(4)GetStream:获取能够发送和接收数据的NetworkStream对象TCP编程的⼀般步骤1.⽹络通信的最基本的前提就是客户端要先和服务器建⽴TCP连接2.服务端要不断的监听客户端是否有连接请求、并且服务端能要识别特定的客户端3.连接并创建对应的套接字4.发送数据和接收数据编写服务器端程序的⼀般步骤1.创建⼀个TcpListener对象,然后调⽤该对象的Start⽅法在指定的端⼝进⾏监听2.在单独的线程中,⾸先循环调⽤AcceptTcpClient⽅法接收客户端的连接请求,从该⽅法中的返回结果中得到与该客户端对应的TcpClient对象,并利⽤该对象的GetStream⽅法得到NetworkStream。

OPC协议解析-OPC客户端与服务器通讯解析

OPC协议解析-OPC客户端与服务器通讯解析

OPC协议解析-OPC客户端与服务器通讯解析1 OPC服务器OPC服务器, 是指按照OPC基⾦组织规定的OPC规范群开发的软件驱动。

OPC服务器作为中间媒介负责从数据源读取数据再跟另外⼀端的客户端通信。

在的结构图中, 通信的发起端是, 也只能是OPC客户端。

客户端和服务器的对话是双向的, 也就是说, 客户端既可以从服务器读出也可以向服务器写⼊。

TOPC基⾦会定义了四种不同类型的OPC服务器。

他们分别是:OPC数据访问服务器(OPC DA) – 它基于 , 是⼀种为实时数据通讯特别定义的服务器类别。

OPC历史数据访问服务器(OPC HDA) – 它基于OPC历史数据访问规范, 是⽤来给⽀持OPC历史数据访问规范的客户端供给历史数据的服务器。

OPC报警与事件服务器(OPC AE) – 它基于OPC报警与事件访问规范, 为⽀持OPC报警与事件规范的客户端传送报警与时间信息。

OPC UA服务器 - 它基于OPC基⾦总会最新并且最先进的UA规范,使得OPC服务器可以与任何数据形式兼容。

总体来说, 前⾯三种是存在时间⽐较长久且⽐较经典的服务器类型, 但最后⼀款OPC UA服务器会随着时间的推移成为今后OPC服务器的中流砥柱。

1)OPC客户端与OPC服务器(OPC数据访问服务器、OPC历史数据访问服务器或OPC报警与事件服务器)的通信OPC服务器是利⽤Microsoft Windows的 COM/DCOM技术作为数据交换的⽅式。

这就是说OPC服务器必须安装在⽀持Microsoft Windows操作系统的PC上。

⼀个OPC服务器可以同时跟多于⼀个的 OPC客户端通讯。

2)OPC服务器 – 数据传译器OPC服务器的⼀个关键作⽤就是将以数据源输出形式传送的数据, 翻译成⽀持之前提到的某⼀或多于⼀种的OPC数据访问规范形式(⽐如说, OPC实时数据访问规范)。

OPC数据规范群只是定义了OPC服务器的OPC通讯模块, 所以数据形式翻译模块的准确性和⾼效性就完全取决于OPC服务器供应商的开发⽅式。

c++与android通讯

c++与android通讯

今天晚上11点半,在学校断网后的十分钟,我终于实现了C++服务器端与Android客户端的通信。

本来很简单的一件事,却因为Android Socket线程阻塞的问题弄了我两天。

好了不多说,直接进入主题:C++ 服务器端:用C++进行网络编程有很多方式,比如可以使用winSock,winInt,或者使用MFC的封装类CSocket等等。

这里我使用的是比较简单的CSocket类来实现。

这里先简单说说使用CSocket类来建立服务器端的过程:上图是C++服务器端与Android客户端通信的流程图。

看到上面的流程图,C++程序员应该感到高兴,这不就是CSocket客户端的变体嘛。

服务器端完全没变化,这先不说,Android客户端连connet动作都省下来了。

这……是不是写错了?没错,确实连connet这个步骤都省了。

当然,没有connect只不过是因为这个connect 的动作直接被封装到了Android Socket的new操作里而已。

不然,服务器端怎么可能知道你这个狡猾的客户端会不会三更半夜的来敲门,说要提供服务啊。

哈哈。

注:在Android Socket的构造函数中有多种形式,并不是每一种形式都必须在构造时就连接到服务器。

读者可以自己阅读Android的开发文档,你会发现Socket也有个名为Connect的成员函数。

好了,有了基本的操作流程后,写起代码来就容易多了。

观察流程图中C++服务器端的构造过程可以知道,服务器端的构造大致分为三大步骤:1、创建用于侦听的socket套接字sevSock并开启侦听;2、创建用于接收/发送信息的socket套接字reveiceSoc,创建后“绑定”到侦听套接字;3、reveiceSoc套接字接收/发送信息。

这几个步骤对于C++程序员来说已经是滚瓜烂熟了。

我也不多说,直接动手更见效。

(开发环境:VS 2008)第一步:创建一个新MFC应用程序项目,这里名为AndroidSocket,应用程序类型为“基于对话框”就可以了。

OPC客户端与服务器端双向通信

OPC客户端与服务器端双向通信

Opc客户端‎与服务器端双‎向通讯1.配置OPC Clinet‎与M acsv‎服务器的连接‎选中OPCC‎l ient菜‎单项“配置与调试”中的“MACSV服‎务器配置”按照实际工程‎中M acsV‎服务器的信息‎进行配置。

注意:1. 如果OPCC‎l ient下‎面状态栏中显‎示“读,写操作正常”,说明与Mac‎sV连接成功‎,可以进行Ma‎c sV服务器‎数据库的读写‎操作。

如果显示“读,写操作不正常‎”,重新配置,直到显示“读,写操作正常”。

2.如果在一个机‎器上启动两个‎O P CCli‎e nt,需要在“MacsV服‎务器配置”中,改变一下UD‎P端口号,不能与另外一‎个O PCCl‎i ent重复‎。

按照实际工程‎中M acsV‎服务器的信息‎进行配置。

3.与OPCSe‎r ver的连‎接选中OPCC‎l ient菜‎单项中的“配置与调试”中的“连接OPC服‎务器”找到要连接的‎O P CSer‎v e r的名称‎,连接。

选中OPCC‎l ient菜‎单项中的“配置与调试”中的“增加标签”,选中我们需要‎的点。

成功后,就可以在OP‎C Clien‎t的主界面中‎看见我们需要‎的点的信息注意:在OPC客户‎端主界面中有‎,“配置与调试”中有“单点通讯方向‎”和“多点通讯方向‎”,其中“单点通讯方向‎”是切换一个点‎的读写状态,可以接收OP‎C Serve‎r发来的数据‎,写入OPCC‎l ient连‎接的Macs‎V数据库,也可以通过改‎变通讯方向反‎向写入与OP‎CServe‎r连接的Ma‎c sV服务器‎。

“多点通讯方向‎”是改变OPC‎Clinet‎主界面中所有‎的点的通讯方‎向。

4.OPCCli‎e n t自动记‎住上次配置OPC客户端‎可以记住上次‎的配置,当计算机重新‎启动后,打开OPCC‎l ient,点击主界面上‎的启动/运行的图标,OPCCli‎e n t就会按‎照上次的配置‎参数运行。

TCP实现服务器与客户端的通信流程

TCP实现服务器与客户端的通信流程

TCP实现服务器与客户端的通信流程TCP(传输控制协议)是一种面向连接的协议,其实现了可靠的通信机制,广泛用于服务器与客户端之间的通信。

下面是TCP实现服务器与客户端的通信流程的详细介绍,共分为五个步骤:建立连接、数据传输、确认接收、连接关闭和异常处理。

第一步:建立连接1. 服务端启动,创建一个Socket对象,通过bind(函数绑定IP地址和端口号,并通过listen(函数监听客户端的连接请求。

2. 客户端启动,同样创建一个Socket对象,通过connect(函数向服务端发出连接请求。

3. 服务端接收到客户端的连接请求,调用accept(函数接收客户端的连接请求,并创建一个新的Socket对象用于与客户端进行通信。

4.服务端与客户端建立连接后,双方开始进行数据传输。

第二步:数据传输1. 客户端向服务端发送数据,通过新创建的Socket对象的send(函数发送数据。

2. 服务端接收到数据,通过新创建的Socket对象的recv(函数接收数据。

3. 服务端处理完收到的数据后,可以向客户端回复数据,通过新创建的Socket对象的send(函数发送数据。

4. 客户端接收到数据后,经过处理后可能会回复数据给服务端,同样通过Socket对象的send(函数发送数据。

5.双方可以多次进行数据传输,直到完成所有的数据交互。

第三步:确认接收1. 客户端发送完最后一部分数据后,会调用shutdown(函数关闭写入通道,表示数据发送完毕。

2. 服务端接收到数据后,可以调用shutdown(函数关闭写入通道,如果后续没有数据要发送给客户端,可以表示数据接收完毕。

3. 客户端和服务端通过Socket对象的recv(函数接收数据,直到接收到0字节的数据,表示连接已关闭。

第四步:连接关闭1. 客户端和服务端可以随时调用close(函数主动关闭连接,也可以等待对方关闭连接。

2. 当一方调用close(函数关闭连接时,另一方会接收到关闭的通知。

服务器和客户机的通信原理

服务器和客户机的通信原理

服务器和客户机的通信原理
服务器和客户机的通信原理
一、客户机-服务器架构
客户机/服务器架构是一种分布式处理架构,它将一个复杂的计
算或应用程序分解成客户机和服务器两个计算或应用程序的组件。

客户机负责用户界面和用户交互,服务器负责数据存储和计算处理。

当用户在客户机上发起一次请求时,由客户机向服务器发出一个请求,服务器完成请求的处理并将结果返回客户机,客户机收到结果后响应用户界面,从而形成一个完整的客户机/服务器体系。

二、客户机-服务器通信原理
1、建立连接:
客户机和服务器之间建立起网络连接。

客户机首先通过指定的服务器地址向服务器发出连接请求,服务器接收到客户机的连接请求后,确认客户机的身份,然后两端的客户机和服务器分别释放自己的端口,建立一条虚拟连接。

2、数据传输:
客户机通过发起请求,服务器接收到请求后,根据请求内容分析,按照报文格式来收发数据,从而完成数据的传输。

3、断开连接:
当客户机和服务器之间的数据交换完成后,客户机向服务器发送断开连接的信号后,客户机和服务器相应关闭自己的端口,从而完成一次客户机服务器之间的数据交换过程。

三、总结
客户机和服务器的通信原理主要涉及客户端发起连接请求、服务器接收连接请求、客户端和服务器之间的数据传输和最后的断开连接等过程。

这些过程中,数据的传输和处理都需要遵循固定的报文格式,才能实现数据的正确传输。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux网络编程-简单的客户端和服务器通讯程序开发入门(2)?007-09-19 21:15:32分类:燙/C++zieckey@简介:本文详细介绍了Linux下B/S结构的客户端服务器通讯程序的开发入门,其中对重要的网络函数和结构体作了详细的说明和分析,最后给出一个简单的客户端和服务器通讯程序示例以加深理解。

2. 初等网络函数介绍(TCP)Linux系统是通过提供套接字(socket)来进行网络编程的.网络程序通过socket和其它几个函数的调用,会返回一个通讯的文件描述符,我们可以将这个描述符看成普通的文件的描述符来操作,这就是linux的设备无关性的好处.我们可以通过向描述符读写操作实现网络之间的数据交流.2.1 socketint socket(int domain, int type,int protocol)domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等).?AF_UNIX只能够用于单一的Unix系统进程间通信,而AF_INET是针对Internet的,因而可以允许在远程主机之间通信(当我们 man socket时发现 domain可选项是 PF_*而不是AF_*,因为glibc是posix的实现所以用PF代替了AF,不过我们都可以使用的).type:我们网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等) SOCK_STREAM表明我们用的是TCP协议,这样会提供按顺序的,可靠,双向,面向连接的比特流. SOCK_DGRAM 表明我们用的是UDP协议, 这样只会提供定长的,不可靠,无连接的通信.protocol:由于我们指定了type,所以这个地方我们一般只要用0来代替就可以了 socket为网络通讯做基本的准备.成功时返回文件描述符,失败时返回-1,看error可知道出错的详细情况.2.2 bind?一旦你有一个套接字,你可能要将套接字和机器上的一定的端口关联起来。

(如果你想用listen()来侦听一定端口的数据,这是必要一步)如果你只想用 connect(),那么这个步骤没有必要。

但是无论如何,请继续读下去。

这里是系统调用 bind() 的大概:int bind(int sockfd, struct sockaddr *my_addr, int addrlen)sockfd:是由socket调用返回的文件描述符.addrlen:是sockaddr结构的长度.my_addr:是一个指向sockaddr的指针. 在中有 sockaddr的定义struct sockaddr{unisgned short as_family;char sa_data[14];};不过由于系统的兼容性,我们一般不用这个头文件,而使用另外一个结构(struct sockaddr_in) 来代替.在中有sockaddr_in的定义struct sockaddr_in{unsigned short sin_family;unsigned short int sin_port;struct in_addr sin_addr;unsigned char sin_zero[8];}我们主要使用Internet所以sin_family一般为AF_INET,sin_addr设置为INADDR_ANY表示可以和任何的主机通信,sin_port是我们要监听的端口号. sin_zero[8]是用来填充的. bind将本地的端口同socket返回的文件描述符捆绑在一起.成功是返回0,失败的情况和socket一样2.3 listen牋牋牋牋牋牋牋牋牋牋牋?假如你不希望与远程的一个地址相连,或者说, 仅仅是将它踢开,那你就需要等待接入请求并且用各种方法处理它们。

处理过程分两步:首先,你听--listen(),然后,你接受--accept() (请看下面的内容)。

除了要一点解释外,系统调用 listen 也相当简单。

int listen(int sockfd, int backlog);sockfd 是调用 socket() 返回的套接字文件描述符。

backlog 是在进入队列中允许的连接数目。

什么意思呢? 进入的连接是在队列中一直等待直到你接受 (accept() 请看下面的文章)连接。

它们的数目限制于队列的允许。

大多数系统的允许数目是20,你也可以设置为5到10。

和别的函数一样,在发生错误的时候返回-1,并设置全局错误变量 errno。

你可能想象到了,在你调用 listen() 前你或者要调用 bind() 或者让内核随便选择一个端口。

如果你想侦听进入的连接,那么系统调用的顺序可能是这样的:socket();?bind();listen();?/* accept() 应该在这 */2.4 accept?准备好了,系统调用 accept() 会有点古怪的地方的!你可以想象发生这样的事情:有人从很远的地方通过一个你在侦听 (listen()) 的端口连接 (connect()) 到你的机器。

它的连接将加入到等待接受(accept()) 的队列中。

你调用accept() 告诉它你有空闲的连接。

它将返回一个新的套接字文件描述符!这样你就有两个套接字了,原来的一个还在侦听你的那个端口, 新的在准备发送 (send()) 和接收 ( recv()) 数据。

这就是这个过程! int accept(int sockfd, struct sockaddr *addr,int *addrlen)sockfd:是listen后的文件描述符.addr, addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了.?bind,listen和accept是服务器端用的函数,accept调用时,服务器端的程序会一直阻塞到有一个客户程序发出了连接.?accept成功时返回最后的服务器端的文件描述符,这个时候服务器端可以向该描述符写信息了. 失败时返回-12.5 connectint connect(int sockfd, struct sockaddr * serv_addr,int addrlen)sockfd:socket返回的文件描述符.serv_addr:储存了服务器端的连接信息.其中sin_add是服务端的地址addrlen:serv_addr的长度connect函数是客户端用来同服务端连接的.成功时返回0,sockfd是同服务端通讯的文件描述符失败时返回-1.牋?现在我们假设你是个 telnet 程序。

你的用户命令你得到套接字的文件描述符。

你听从命令调用了socket()。

下一步,你的用户告诉你通过端口 23(标准 telnet 端口)连接到"132.241.5.10"。

你该怎么做呢? 幸运的是,你正在阅读connect()--如何连接到远程主机这一章。

你可不想让你的用户失望。

connect() 系统调用是这样的:#include <sys/types.h>#include <sys/socket.h>int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);sockfd 是系统调用 socket() 返回的套接字文件描述符。

serv_addr 是保存着目的地端口和 IP 地址的数据结构 structsockaddr。

addrlen 设置为 sizeof(struct sockaddr)。

想知道得更多吗?让我们来看个例子:#include <string.h>#include <sys/types.h>#include <sys/socket.h>#define DEST_IP "132.241.5.10"?#define DEST_PORT 23main()牋 {int sockfd;struct sockaddr_in dest_addr; /* 目的地址*/sockfd = socket(AF_INET, SOCK_STREAM, 0); /* 错误检查 */dest_addr.sin_family = AF_INET; /* host byte order */dest_addr.sin_port = htons(DEST_PORT); /* short, network byte order */dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);bzero(&(dest_addr.sin_zero),; /* zero the rest of the struct *//* don't forget to error check the connect()! */connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));牋 .2.6重要的结构题介绍首先是简单的一个:socket描述符。

它是下面的类型:int仅仅是一个常见的 int。

从现在起,事情变得不可思议了,而你所需做的就是继续看下去。

注意这样的事实:有两种字节排列顺序:重要的字节 (有时叫 "octet",即八位位组) 在前面,或者不重要的字节在前面。

前一种叫“网络字节顺序(Network Byte Order)”。

有些机器在内部是按照这个顺序储存数据,而另外一些则不然。

当我说某数据必须按照NBO 顺序,那么你要调用函数(例如 htons() )来将它从本机字节顺序 (Host Byte Order) 转换过来。

如果我没有提到NBO, 那么就让它保持本机字节顺序。

我的第一个结构(在这个技术手册TM中)--struct sockaddr.。

这个结构为许多类型的套接字储存套接字地址信息:struct sockaddr {牋 unsigned short sa_family; /* 地址家族, AF_xxx */牋 char sa_data[14]; /*14字节协议地址*/牋 };sa_family 能够是各种各样的类型,但是在这篇文章中都是 "AF_INET"。

sa_data包含套接字中的目标地址和端口信息。

这好像有点不明智。

为了处理struct sockaddr,程序员创造了一个并列的结构: struct sockaddr_in ("in" 代表 "Internet"。

相关文档
最新文档