1.软文推荐

2.软文推荐

3.软文推荐

Web socket数据传输过程:TCP协议在建立连接后提供全双工通信服务,但客户机/服务器程序的一般过程是客户机主动发起请求,服务器被动处理请求,并逐一回答问题。因此,服务器在从...

数据传输的过程:建立连接后,TCP协议提供全双工的通信服务,但是一般的客户端/服务器程序的流程是由客户端主动发起请求,服务器被动处理请求,一问一答的方式。

因此,服务器从accept()返回后立刻调用read(),读socket就像读管道一样,如果没有数据到达就阻塞等待,这时客户端调用write()发送请求给服务器,服务器收到后从read()返回,对客户端的请求进行处理,在此期间客户端调用read()阻塞等待服务器的应答,服务器调用write()将处理结果发回给客户端,再次调用read()阻塞等待下一条请求,客户端收到后从read()返回,发送下一条请求,如此循环下去。

如果客户端没有更多的请求了,就调用close()关闭连接,就像写端关闭的管道一样,服务器的read()返回0,这样服务器就知道客户端关闭了连接,也调用close()关闭连接。

注意,任何一方调用close()后,连接的两个传输方向都关闭,不能再发送数据了。

如果一方调用shutdown()则连接处于半关闭状态,仍可接收对方发来的数据。

在学习socketAPI时要注意应用程序和TCP协议层是如何交互的:*应用程序调用某个socket函数时TCP协议层完成什么动作,比如调用connect()会发出SYN段*应用程序如何知道TCP协议层的状态变化,比如从某个阻塞的socket函数返回就表明TCP协议收到了某些段,再比如read()返回0就表明收到了FIN段.最简单的TCP网络程序Service.c的作用是从客户端读字符,然后将每个字符转换为大写并回送给客户端。

intsocket(intfamily,inttype,intprotocol);socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调用出错则返回-1。

对于IPv4,family参数指定为AF_INET。

对于TCP协议,type参数指定为SOCK_STREAM,表示面向流的传输协议。

如果是UDP协议,则type参数指定为SOCK_DGRAM,表示面向数据报的传输协议。

protocol参数的介绍从略,指定为0即可。

intbind(intsockfd,conststructsockaddr*myaddr,socklen_taddrlen);服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接,因此服务器需要调用bind绑定一个固定的网络地址和端口号。

bind()成功返回0,失败返回-1。

bind()的作用是将参数sockfd和myaddr绑定在一起,使sockfd这个用于网络通讯的文件描述符监听myaddr所描述的地址和端口号。

前面讲过,structsockaddr*是一个通用指针类型,myaddr参数实际上可以接受多种协议的sockaddr结构体,而它们的长度各不相同,所以需要第三个参数addrlen指定结构体的长度.intlisten(intsockfd,intbacklog);典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accept()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept的客户端就处于连接等待状态,listen()声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接待状态,如果接收到更多的连接请求就忽略。

listen()成功返回0,失败返回-1。

intaccept(intsockfd,structsockaddr*cliaddr,socklen_t*addrlen);三方握手完成后,服务器调用accept()接受连接,如果服务器调用accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来。

cliaddr是一个传出参数,accept()返回时传出客户端的地址和端口号。

addrlen参数是一个传入传出参数(value-resultargument),传入的是调用者提供的缓冲区cliaddr的长度以避免缓冲区溢出问题,传出的是客户端地址结构体的实际长度(有可能没有占满调用者提供的缓冲区)。

如果给cliaddr参数传NULL,表示不关心客户端的地址。

由于客户端不需要固定的端口号,因此不必调用bind(),客户端的端口号由内核自动分配。

注意,客户端不是不允许调用bind(),只是没有必要调用bind()固定一个端口号,服务器也不是必须调用bind(),但如果服务器不调用bind(),内核会自动给服务器分配监听端口,每次启动服务器时端口号都不一样,客户端要连接服务器就会遇到麻烦。

intconnect(intsockfd,conststructsockaddr*servaddr,socklen_taddrlen);客户端需要调用connect()连接服务器,connect和bind的参数形式一致,区别在于bind的参数是自己的地址,而connect的参数是对方的地址。

connect()成功返回0,出错返回-1。

sockaddr数据结构注:更多精彩教程请关注电脑高手网电脑教程栏目,电脑高手网电脑办公群:189034526欢迎你的加入

相关文章 8

1

QQ如何更换封面 45秒前

QQ是现在很火爆的一款社交APP,下面我们就一起来看看QQ如何更换封面吧!01、在电脑上登好QQ,然后点击头像旁边的小按钮,如下图所示。...

2

win7删除开机密码如何操作 win7系统开机密码怎么清除 2分钟前

对于私人的win7电脑,常常会给自己的电脑设置一些保护隐私的密码,其中就包括了开机密码,这对于有些用户来说还是非常有必要的,但是...

3

怎样拍摄好看的泳装照片? 5分钟前

01、首先,要想拍出美美的泳装照,你需要选择适合自己的泳衣,一般来说,分体泳衣比连体泳衣更能展现身材,使得拍出的照片更加... 0...

4

华硕a42j,华硕x42j 7分钟前

华硕k550dASUS网卡驱动程序呢?ASUS网卡驱动程序有很多原因。接下来,让我们看看是什么导致了ASUS网卡驱动程序。我们希望帮助您找出问题并...

5

ai怎么扩大缩小,ai怎么扩大缩小图片或画面 10分钟前

ai软件可以很简单的将图片和画面扩大缩小,这个流程请看下面图文。01、首先打开ai软件,导入一个图片。02、先用选择工具,选中图片,这...

6

如何在Win10系统中创建新的网络连接 10分钟前

使用计算机时,我想重新建立网络连接,那么Win10系统如何创建新的网络连接?因此,计算机技术栏将为您提供一种在Win10系统中创建新网络...

7

PPT幻灯片中表格大小无法设置怎么办,PPT中如何快速调整表格大小 12分钟前

解决PPT中表格缩小和放大的问题,特别是表格卡住无法缩小PPT中表格的缩小与放大的问题。... PPT 插入一个8*6的表格。 表格的放大:鼠标拖...

8

ppt文档设计主题怎么设置,怎么设置分栏 13分钟前

你能用word制作下Word巧绘艺术字特效之——白加黑图所示的黑白特效吗?答案是肯定的!然而,首先要说的是,绘画的主要目的并不是通过绘...