`
memorymyann
  • 浏览: 270813 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

4.unix网络编程的大致流程

阅读更多

在服务器端:

1.首先是调用socket函数创建一个socket,此时返回该socket描述字(前面介绍过)。此时的服务器socket处于closed状态。

 

2.此时socket被建立,但是socket内部除了协议外,IP地址和端口号均由系统指定。因此接下来将会自己声明一个网络套接字(该套接字结构取决于你要使用什么协议,常用的IPV4协议,结构为struct sockaddr_in),该结构在使用之前一般先使用bzero函数清0(你也可以使用memset等其它函数,清0即可)。然后给该结构指定协议族,IP地址(一个机器有几个IP地址,比如127.0.0.1或者内网地址,可能还有外网地址。当你在套接口中指定地址后,别的机器都必须通过这个IP才能访问。举个简单例子,比如说你指定了127.0.0.1,则其它机器只能使用127.0.0.1: 端口号来访问服务器进程,遗憾的是127.0.0.1通过不了路由。以此类推。当你想使用任何地址都可以访问时候,指定IP地址为INADDR_ANY,指定函数前面介绍过)。端口号(服务器一般都是要指定端口)。然后调用bind将你自己定义的地址描述结构绑定到之前定义的socket,此时服务器socket仍然处于closed状态。

 

3.调用listen函数,将该socket设置成被动打开,此时,若客户机socket没有发来建立连接请求,该socket处于listen状态。

 

4.调用accept函数,此时字面理解函数为接受。其实是内核为监听socket创建了2个队列,一个队列未完成队列:这个队列存储的内容是对方发来了3路握手请求,但3路握手尚未接受,链接尚未建立的链接(这么叫不好,不过我想不到好的修饰词)。一个队列就是完成链接队列,意思很明显,就是3路握手结束,链接已经建立。accept就会从已链接队列中取出一个链接,并返回这个链接的描述符,双方可以通过描述符通信。此时socket处于established。若已完成队列没有链接,则该函数会将服务器进程阻塞。

 

5.调用read或者write进行通信。

 

一般服务器不会关闭监听套接口,除非关闭服务器。

 

 

客户端

 

1.第一步通过socket函数建立socket,并返回描述字。closed状态

 

2.(可以省略),和服务器一样为自己socket 指定IP和端口(指定IP没有意义,指定端口表示从指定的端口链接,而不是由内核分配的端口),因为客户端不需要指定,所以一般都不做这一步。

 

3.创建socket描述结构(描述服务器),指定服务器IP和端口,通过connect函数想服务器发出链接请求(此时会触发3路握手)。当函数返回时候表示链接建立(也就是当前链接已经被加入到服务器socket完成链接的队列中),并返回链接描述符。established状态

 

4.调用read或者write进行数据通信。

 

5.关闭链接。进入closed状态。

 

 

 

注:网络通信中read,write,readline不同于通常的文件I/O。当你write大量数据时候,接受端read函数可能只是接受了一部分。这不是错误情况。

TCP中,数据首先放在应用进程缓冲区,然后由write拷贝到了套接口发送缓冲区。当有大批量数据传送时候,比如现在进程缓冲区有10M数据,而套接口只有4M大小,那么 write就会将4M写入,有下面的协议发送。等对法确认取得后,再继续写入,直到10M数据全部写入,明显最后有2M写入,但这2M写入了套接口缓冲区,并不代表对方已经收到。但是write函数已经返回,他返回只是意味着你可以继续使用套接口缓冲区,而不意味对方已经收到。从而缺陷很明显对方先收到4M,明显要少于你发送的10M数据,这时你就要多次调用read函数来获取剩余的数据。

 

UDP中,UDP没有发送缓冲区。但是UDP发送的数据包有上限,所以UDP发送缓冲区大小实际就是UDP数据包的上限,一旦用户发送的数据大于UDP数据包上限,就直接返回错误,UDP本身是不可靠协议,他无需为客户保存数据因此也不需要发送缓冲区。如果客户的数据小于上限,则UDP会将数据传送到下面数据链路层,一旦下层拷贝了数据,UDP就直接丢弃。

分享到:
评论

相关推荐

    UDP.zip_网络编程_Unix_Linux_

    本资料包“UDP.zip”包含了Unix/Linux环境下使用C语言编写的UDP通信程序,分为服务器端(udp_server.c)和客户端(udp_client.c),是学习UDP网络编程的实用案例。 首先,让我们了解UDP协议的基本特性。与TCP...

    logips2pp.rar_驱动编程_Unix_Linux_

    驱动程序的工作流程大致如下: 1. **初始化**:在启动时,驱动程序会注册到内核的设备模型中,等待与对应的硬件设备进行交互。 2. **探测设备**:当PS/2++鼠标插入系统后,驱动程序会尝试检测其存在,并进行必要的...

    Sed AWK编程指南

    这些命令可以被组织成一个脚本,其执行流程大致如下: 1. **读取输入**:逐行读取文件中的内容。 2. **执行命令**:根据命令对每一行进行相应的编辑操作。 3. **输出结果**:处理后的文本行输出到标准输出或指定...

    SOCKET编程之TCP服务端

    在IT行业中,网络通信是不可或缺的一部分,而SOCKET编程则是实现这一目标的关键技术。本篇将深入探讨"SOCKET编程之TCP服务端"的相关知识点,包括SOCKET的基础概念、TCP协议的特点以及如何构建一个基本的TCP服务器。 ...

    LanTalk_src LanTalk_src

    在Unix系统中,socket是一种进程间通信(IPC)机制,而在网络编程中,它用于两个或多个进程间的通信,无论它们是否在同一台计算机上。在LanTalk_src中,socket被用作构建客户端和服务器之间通信的桥梁。 Socket的...

    以编程方式将Mac背景设置为500px上的随机图像_Shell_下载.zip

    以下是大致的脚本流程: 1. 使用`curl`命令访问500px API,获取随机图像的JSON数据。 2. 使用`jq`解析JSON,提取图像URL。 3. 使用`curl`或`wget`下载图像。 4. 使用`osascript`编写AppleScript代码,将下载的图像...

    Python库 | lighthive-0.2.2.tar.gz

    4. **网络编程库**:如requests、urllib,用于发送HTTP请求和处理网络数据。 5. **图形用户界面库**:如Tkinter、PyQt,用于创建桌面应用程序。 6. **自动化库**:如Selenium、BeautifulSoup,用于网页抓取和自动化...

    树莓派系统uupwin10软件包

    4. `uup_download_macos.sh` 和 `uup_download_linux.sh`:这两个是Unix Shell脚本,分别用于MacOS和Linux系统的UUP文件下载。 5. `CustomAppsList.txt`:可能是一个自定义应用列表,允许用户指定要在Windows 10 IoT...

    shell编程文档

    Shell编程是一种重要的Linux和UNIX操作系统的命令行界面编程方式,也是开发和管理Linux及Android系统时必不可少的技能之一。Shell编程文档详细介绍了Shell编程的基础知识,包括变量、环境变量、测试语句、控制语句、...

    gcc学习资料

    在GCC 3.xx版本中,编译流程大致如下: 1. 各种源代码(如C、C++、Java等)通过各自的解析器进入编译器。 2. 解析后的源代码被转换为RTL(Register Transfer Language)表示。 3. RTL表示经过优化处理。 4. 最终...

    window下搭建redis.zip

    搭建流程大致如下: 1. 安装Ruby环境,运行`rubyinstaller-2.2.4-x64.exe`。 2. 使用Ruby安装Redis gem,运行`gem install redis-3.2.2.gem`。 3. 运行批处理文件`服务构建.bat`,这将启动Redis服务器。 4. 阅读`...

    Python库 | obj.all-7.tar.gz

    Python库是Python编程语言中不可或缺的一部分,它们是预先编写好的函数和模块集合,可以供开发者在自己的项目中复用,以提高效率并减少代码重复。`obj.all-7.tar.gz`是一个压缩包文件,通常包含了一系列Python库或...

    protobuf-java-3.0.0.tar.gz

    protobuf的使用流程大致如下: 1. 定义数据结构:在.proto文件中使用protobuf语法定义数据结构,如消息类型、字段、枚举等。 2. 编译.proto文件:使用`protoc`编译器生成对应语言的源代码,如Java或C++。 3. 在代码...

    MATLAB_R2010a_下载地址+在win7下安装全过程截图

    虽然原文中没有详细的文字说明,但根据提供的截图文件名可以大致推测出安装流程中的关键步骤: - **启动安装程序** (`1.jpg`): 显示安装程序的初始界面。 - **选择安装类型** (`2.jpg`): 用户可以选择完整安装或是...

    C# SCP下载和上传

    SCP(Secure Copy Protocol)是一种在不安全的网络环境中安全传输文件的安全协议,常用于Linux和Unix系统。在C#编程中,我们可以通过第三方库来实现SCP的功能,例如Renci.SshNet。这个库提供了一个方便的API,允许...

    pic_windos_0328

    当提到“源码”时,我们可能会讨论编程语言(如C++、Python或Java)、版本控制系统(如Git)、以及软件开发流程,如编译、调试和测试。 “工具”标签则广泛得多,可能指的是一系列用于开发、调试、优化或管理软件的...

    otrs-6.0.26.zip

    OTRS(Open-source Ticket Request System)是一款开源的票务管理系统,广泛用于客户服务、技术支持和内部工作流程管理。这里我们关注的是OTRS的6.0.26版本,它包含了两个关键文件:`otrs-6.0.26-01.noarch.rpm`和`...

    cs_epoll.tar.gz

    在服务器端,epoll的工作流程大致如下: 1. 创建epoll实例。 2. 使用`epoll_ctl()`将服务器的监听套接字加入epoll集合,并设置监听读事件。 3. 调用`epoll_wait()`等待事件发生,当有新的连接请求时,epoll会返回...

    Python库 | nvdss-0.0.9.tar.gz

    在Python的世界里,库是开发者的重要工具,它们提供了丰富的功能,让编程变得更加高效和便捷。本文将深入探讨名为nvdss-0.0.9的Python库,了解其功能、用途以及如何在实际开发中应用。 首先,nvdss-0.0.9是一个特定...

    ArcGIS Engine 10 开发手册.pdf

    4. 应用程序开发流程:这部分会涉及如何使用控件创建第一个桌面应用程序,包括创建用户界面、集成GIS功能、使用控件进行空间数据库操作、处理几何对象和空间参考、进行矢量数据空间分析和栅格数据分析、地图编辑和...

Global site tag (gtag.js) - Google Analytics