网络编程实用教程_第3章

合集下载

网络编程实用教程第三版(可下载使用)

网络编程实用教程第三版(可下载使用)

1.1 网络编程相关的基本概念
下表是一些典型的应用层协议分配到的保留端口。
TCP的保留端口
UDP的保留端口
FTP
21
DNS
53
HTTP
80
TFTP
69
SMTP
25
SNMP
161
POP3
110
……
其余的端口号,1024-65535,称为自由端口号,采用本 地分配,又称为动态分配的方法。
1.1 网络编程相关的基本概念
这个五元组称为一个全相关(association)。即两个 协议相同的半相关才能组合成一个合适的全相关,或完 全指定一对网间通信的进程。
1.1 网络编程相关的基本概念
1.1.3 网络协议的特征 P7 1.面向消息的协议与基于流的协议 P8 (1)面向消息的协议 面向消息的协议以消息为单位在网上传送数据,在发 送端,消息一条一条地发送,在接收端,也只能一条一条 地接收,每一条消息是独立的,消息之间存在着边界。
接收端,不出错,不丢失,不重复,保证数据的完整性, 称为保证投递。
次序性是指对数据到达接收端按顺序进行处理。保护 次序性的协议保证接收端收到数据的顺序就是发送端发出 数据的发送顺序,称为按序递交。
1.2 三类网络编程 P10
1.2.1 基于TCP/IP协议栈的网络编程 基于TCP/IP协议栈的网络编程是最基本的网络编程
的端口号) 这样一个三元组,叫做一个半相关(half-association),
它标识了因特网中,进程间通信的一个端点,也把它称为进 程的网络地址。
1.1 网络编程相关的基本概念
5.网络中进程通信的标识 P7 一个完整的网间通信需要一个五元组在全局中唯一地
来标识: (传输层协议,本地机IP地址,本地机传输层端口,远地 机IP地址,远地机传输层端口)

网络编程基础教程

网络编程基础教程

网络编程基础教程第一章:介绍网络编程的基本概念和原理网络编程是指通过计算机网络实现程序之间的通信和数据交换的技术和方法。

在现代计算机技术中,网络编程已经成为非常重要的一部分。

网络编程主要涉及设置网络连接、数据传输和数据处理等方面。

1.1 网络编程的重要性随着互联网的快速发展,网络编程已经成为各种应用程序开发的常见需求。

无论是网页浏览器、电子邮件客户端还是移动应用程序,都需要通过网络与服务器端进行通信。

因此,掌握网络编程技术对于软件开发人员来说至关重要。

1.2 网络编程的基本原理网络编程基于计算机网络的原理,通过网络协议实现数据的传输和通信。

常见的网络协议有TCP/IP、HTTP、UDP等。

网络编程主要涉及网络套接字的创建、连接和数据交互等方面。

1.3 常见的网络编程语言网络编程涉及多种编程语言,常见的有Java、Python、C++等。

不同的语言提供了各自的网络编程库和框架,开发人员可以根据自己的需求选择合适的语言进行开发。

第二章:网络套接字的创建和使用网络套接字是网络编程中的关键概念,它用于在不同主机之间进行数据传输。

本章将介绍网络套接字的创建和使用。

2.1 网络套接字的分类网络套接字可以分为两种类型:流套接字(TCP)和数据报套接字(UDP)。

流套接字提供可靠的、面向连接的数据传输,而数据报套接字提供不可靠的、无连接的数据传输。

2.2 网络套接字的创建创建网络套接字需要指定协议族(如AF_INET或AF_INET6)和套接字类型(如SOCK_STREAM或SOCK_DGRAM)。

创建套接字的库函数通常为socket()。

2.3 网络套接字的连接TCP套接字需要进行连接操作才能进行数据传输,而UDP套接字则不需要连接。

TCP套接字的连接操作由connect()函数完成。

2.4 网络套接字的数据传输数据传输可以使用send()和recv()函数来进行。

TCP套接字提供面向流的数据传输,而UDP套接字则提供基于数据报的数据传输。

3.2.2 WinSock 的错误处理函数[共3页]

3.2.2 WinSock 的错误处理函数[共3页]

58wVersionRequested =MAKEWORD(1,1); // 生成版本号1.1err = WSAStartup(wVersionRequested, &wsaData ); // 调用初始化函数if (err!=0 ) { return;} // 通知用户找不到合适的DLL文件// 确认返回的版本号是客户要求的1.1if ( LOBYTE(wsaData.wVersion )!=1 || HIBYTE(wsaData.wVersion )!=1) {WSACleanup(); return;}/*至此,可以确认初始化成功,WinSock.dll可用*/}2.注销函数WSACleanup( )当程序使用完WinSock.dll提供的服务后,应用程序必须调用WSACleanup( )函数,来解除与WinSock.dll库的绑定,释放WinSock实现分配给应用程序的系统资源,中止对Windows Sockets DLL的使用。

(1)WSACleanup( )函数的调用格式。

int WSACleanup ( void );返回值:如果操作成功,返回0,否则返回SOCKET_ERROR。

可以调用WSAGetLastError( )获得错误代码。

(2)WSACleanup( )函数的功能。

应用程序或DLL在使用Windows Sockets服务之前必须要进行一次成功的WSAStartup( )调用,当它完成了Windows Sockets的使用后,应用程序或DLL必须调用WSACleanup( ),将其从Windows Sockets的实现中注销,并且该实现释放为应用程序或DLL分配的任何资源。

任何打开的并已建立连接的SOCK_STREAM类型套接口在调用WSACleanup( )时会重置,而已经由closesocket( )关闭,但仍有要发送的悬而未决数据的套接口则不会受影响,该数据仍继续发送。

服务器如何同时为多个客户机服务_网络编程实用教程(第3版)_[共2页]

服务器如何同时为多个客户机服务_网络编程实用教程(第3版)_[共2页]

18 在浏览网易网站的页面,但每个人都感觉不到别人对自己的影响。

其实,今天Internet上的服务器,往往同时接待着成千上万的客户机。

但服务器所在的计算机可能只有一个通往Internet的物理连接。

(2)一个用户的计算机上同时运行多个连接不同服务器的客户机:有经验的网友都知道,在Windows的桌面上,可以同时打开多个IE浏览器的窗口,每个窗口连接一个网站,这样可以加快下载的速度。

当在一个窗口中浏览的时候,可能另一个窗口正在下载页面文件或图像。

在这里,一个IE浏览器的窗口,就是一个IE浏览器软件的运行实例,就是一个作为客户机的应用进程,它与一个服务器建立一个连接关系,支持与该服务器的会话。

这样,用户的PC中就同时运行着多个客户机,分别连接着不同的服务器。

同样,用户的PC也只有一个通往Internet的物理连接。

(3)一个服务器类的计算机同时运行多个服务器:一套足够强大的计算机系统能够同时运行多个服务器进程。

在这样的系统上,对应每种提供的服务都有一个服务器程序在运行。

例如,一台计算机可能同时运行文件服务器和WWW服务器。

图1.9说明了两台计算机上的客户机程序访问第3台计算机上的两个服务器。

虽然一台计算机上能运行多种服务,但它与Internet只需有一个物理连接。

图1.9 一台计算机中的多个服务器被多个计算机的客户机访问一台服务器类计算机能够同时提供多种服务,每种服务需要一个独立的服务器程序。

在一台计算机上运行多种服务是实际可行的,经验告诉我们,对服务器的需求往往很分散,一个服务器可能在很长一段时间里一直处于空闲状态。

空闲的服务器在等待请求到来时不占用计算机的计算资源。

这样,如果对服务的要求量比较小,将多个服务器合并到一台计算机上,会在不明显降低性能的情况下大幅度地降低开销。

让一台计算机运行多种服务是很有用的,因为这样硬件可以被多个服务所共享。

将多个服务器合并到一台大型的服务器类的计算机上也有助于减轻系统管理员的负担,因为对系统管理员来说计算机系统减少了。

《计算机网络技术实用教程》第3章

《计算机网络技术实用教程》第3章
发送方 接收方
任何分组的报头信息都包括 这个分组的源和目的地址。 这个分组的源和目的地址。通常 只将分组发送给一台计算机, 只将分组发送给一台计算机,并 且称为单播分组。 且称为单播分组。广播分组) 组(称为广播分组)。分组的目的 地址允许每台计算机阅读分组并 且对分组起作用。 且对分组起作用。
:::::《计算机基础与实训教材系列》系列丛书官方网站 :::::《计算机基础与实训教材系列》
/edu /edu :::::
3.2 分组/帧在网络通信中的作用 分组/
计算机通信通常包含长消息。 计算机通信通常包含长消息。由于网络不能很好地处理大 块数据, 块数据,所以它们将数据重新格式化为较小的更容易管理的部 称为分组或者帧(即第一章所说的PDU PDU, 分,称为分组或者帧(即第一章所说的PDU,也称为协议数据单 分组数据单元或者有效载荷数据单元) 元、分组数据单元或者有效载荷数据单元)。
在计算机内部链接单元的并行线集合称为总线。 在计算机内部链接单元的并行线集合称为总线。当数据从 一个组件移动到另一个组件时,它沿着总线移动。 一个组件移动到另一个组件时,它沿着总线移动。 目前,现代PC机中有许多PC总线类型( PC机中有许多PC总线类型 目前 , 现代 PC 机中有许多 PC总线类型 ( 也称为总线体系结 每条总线的布局和配置都有所区别,因此, 构 ) 。每条总线的布局和配置都有所区别, 因此, 使用的任何 适配器卡都必须与插座的总线类型相匹配。 适配器卡都必须与插座的总线类型相匹配。
在网络通信中必须考虑的因素: 在网络通信中必须考虑的因素:计算机如何将数据放在 电缆上以及如何确保数据无损地到达它的目的地。 电缆上以及如何确保数据无损地到达它的目的地。
主要的接入方法 选择接入方法

计算机网络技术实用教程(第四版)第03章完美版PPT

计算机网络技术实用教程(第四版)第03章完美版PPT
劳与被效劳的过程。这些原语供用户和其他实体访问该 效劳。这些原语通知效劳提供者采取某些行动或报告某 个对等实体的活动。效劳原语可被划分为4类,分别是 请求、指示、响应、确认。
3.1 计算机网络体系结构概述
3.1.3 网络体系结构
网络体系结构是从体系结构的角度来研究和设计计 算机网络体系,其核心是网络系统的逻辑结构和功能分 配定义,即描述实现不同计算机系统之间互连和通信的 方法以及结构,是层和协议的集合。通常采用结构化设 计方法,将计算机网络系统划分成假设干功能模块,形 成层次清楚的网络体系结构。
3.1 计算机网络体系结构概述
1. 实体与对等实体
实 体:
任何可以发送或接收信息的硬件或软件进程。
对等实体:
不同机器上位于同一层次、完成相同功能的实体。
3.1 计算机网络体系结构概述
2. 通信协议
协 议:
语法 语义 同步
为进行网络中的数据交换而建立的规则﹑标 准或约定即称为网络协议。
3.1 计算机网络体系结构概述
3.2 ISO/OSI开放系统互连参考模型
3.2.1 OSI七层模型
OSI采用分层的结构 应用层(Application Layer)
化技术,共分7层,从 表示层(Presentation Layer)
低到高为:物理层、数 会话层(Session Layer)
据链路层、网络层、传 传输层(Transport Layer)
3. 效劳与接口
服 务:
在网络分层结构模型中,每一层为相邻的上一层 所提供的功能称为效劳。
效劳访问点:
在同一系统中相邻两层的实体进行交互的地方,通常称 为效劳访问点SAP。
3.1 计算机网络体系结构概述
4. 效劳类型

《网络编程》课件

《网络编程》课件

案例二:社交网络平台的架构与实现
总结词
社交网络平台的架构与实现需要关注可扩展性、可用性和可靠性等方面。
详细描述
社交网络平台需要支持数百万甚至数十亿的用户,因此其架构必须具备高度的可扩展性,能够随着用户数量的增 长而平滑地扩展。同时,为了提供不间断的服务,需要保证系统的可用性和可靠性,采取各种容错和备份措施。 此外,还需要考虑数据的安全性和隐私保护问题。
HTTP协议
01
HTTP协议是用于从服务器请求和发 送网页内容的协议。
02
HTTP协议是无状态的,这意味着服 务器不会为每个请求保持状态。
03
HTTP协议是请求/响应模型,客户端 发送请求,服务器返回响应。
HTML/CSS/JavaScript
HTML是用于创建网页结构的标记 语言。
CSS是用于描述网页样式和布局 的语言。
THANKS FOR
感谢您的观看
WATCHING
网络编程的历史与发展
起源
1
网络编程起源于20世纪60年代,随着ARPANET等 早期网络的兴起,人们开始研究如何实现不同计
算机之间的通信。
发展历程
2
随着互联网的普及和发展,网络编程语言和技术 不断涌现和发展,如Socket编程、HTTP协议等。
未来趋势
3
随着云计算、物联网等技术的兴起,网络编程将 更加注重安全性、隐私保护和异构网络的互联互
案例四:网络安全攻防实践
总结词
网络安全攻防实践涉及网络攻击和防御的策 略和技术,是保障网络安全的重要手段。
详细描述
网络安全攻防实践包括对各种网络攻击手段 的深入了解,如黑客攻击、病毒传播、拒绝 服务攻击等,同时也需要掌握相应的防御策 略和技术,如防火墙配置、入侵检测系统部 署、数据加密等。此外,还需要关注安全漏 洞的发现和修补,以及应急响应和灾难恢复 等方面的实践经验。

C语言网络编程入门指南

C语言网络编程入门指南

C语言网络编程入门指南随着互联网的发展,网络编程变得越来越重要。

作为一门基础的编程语言,C语言在网络编程领域也扮演着重要的角色。

本文将为读者提供一个C语言网络编程的入门指南,帮助他们理解和应用C语言进行网络通信。

一、理解网络编程的基础知识1.1 网络协议网络通信基于一系列的网络协议,如TCP/IP协议。

了解这些协议的基本概念和工作原理对于进行网络编程至关重要。

1.2 Socket编程Socket是一种提供了网络通信能力的编程接口,C语言通过操作Socket实现网络编程。

理解Socket的工作原理和使用方法是进行C语言网络编程的关键。

二、网络编程基础2.1 客户端-服务器模型网络编程常常基于客户端-服务器模型。

服务器端负责监听并响应客户端的请求,客户端则向服务器发送请求并接收服务器的响应。

掌握如何编写服务器端和客户端程序是C语言网络编程的基础。

2.2 IP地址和端口号网络通信需要使用IP地址和端口号进行标识。

在C语言网络编程中,我们需要了解如何获取和设置IP地址和端口号,以便进行正确的网络通信。

三、 C语言网络编程实践3.1 创建Socket使用C语言进行网络编程的第一步是创建Socket。

通过Socket函数,我们可以创建一个用于网络通信的Socket对象。

3.2 绑定Socket服务器端程序通常需要将Socket与特定的IP地址和端口号绑定。

这样服务器才能监听特定的网络请求。

3.3 监听和接受客户端请求服务器端通过监听函数等待客户端的连接请求,并在接受到请求后建立与客户端的连接。

3.4 发送和接收数据一旦建立了连接,服务器和客户端可以通过发送和接收函数进行数据交换。

C语言提供了相应的函数来实现数据的发送和接收操作。

3.5 关闭连接和释放资源网络通信结束后,服务器和客户端需要关闭Socket连接并释放相关资源。

这样可以确保网络连接的正确关闭和资源的有效释放。

四、错误处理与调试技巧4.1 错误处理在进行网络编程时,错误处理是非常重要的。

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




Windows Sockets为了实现当一个应用程序的套接字调用处于阻塞 时,能够放弃CPU让其它应用程序运行,它在调用处于阻塞时便 进入一个叫“HOOK”的例程,此例程负责接收和分配 WINDOWS消息,使得其它应用程序仍然能够接收到自己的消息 并取得控制权。 在Windows Sockets实现中,对于不能立即完成的阻塞操作做如下 处理:DLL初始化→循环操作。在循环中,它发送任何 WINDOWS 消息,并检查这个Windows Sockets调用是否完成 (WSAIsBlocking函数),在必要时,它可以放弃CPU让其它应 用程序执行。我们可以调用WSACancelBlockingCall函数取消此 阻塞操作。 一个阻塞操作尚未完成之前,除了 WSACancelBlockingCall() 和 WSAIsBlocking() 函数,不允许应用程序再调用其他任何 WinSock函数,如果某个WinSock函数在此时被调用,则会失败 并返回错误代码WSAEINPROGRESS。
第3章 Windows环境的网络编程
3.1 Windows Sockets规范 3.1.1 概述
Microsoft公司以Berkeley Sockets规范为范例,定义了 Windows Socktes规范,简称Winsock规范。这是Windows操作 系统环境下的套接字网络应用程序编程接口(API)。 Winsock以库函数的方式实现。不仅包括了Berkeley Sockets 风格的库函数,也包括了一组针对Windows操作系统的扩展库 函数,使编程者能充分利用Windows操作系统的消息驱动机制 进行编程。
4.指针 所有应用程序与Windows Sockets使用的指针都必须 是 FAR 指 针 。 为 了 方 便 应 用 程 序 开 发 者 使 用 , Windows Sockets规范定义了数据类型LPHOSTENT。 near指针和far指针的区别 在DOS下(实模式)地址是分段的,每一段的长度为64K字节, 刚好是16位(二进制的十六位)。 near指针的长度是16位的,所以可指向的地址范围是64K字 节,通常说near指针的寻址范围是64K。 far指针的长度是32位,含有一个16位的基地址和16位的偏 移量,将基地址乘以16后再与偏移量相加(所以实际上far指 针是20位的长度)即可得到far指针的1M字节的偏移量。所以 far指针的寻址范围是1M字节,超过了一个段64K的容量。例 如一个far指针的段地址为0x7000,偏移量为0x1244,则该指 针指向地址0x71224.如果一个far指针的段地址是0x7122,偏 移量为0x0004,则该指针也指向地址0x71224。

请注意,设计自己的阻塞处理例程时,除了函数 WSACancelBlockingHook() 之外,它不能使用其它 的 Windows Sockets API函数。在处理例程中调用 WSACancelBlockingHook()函数将取消处于阻塞的 操作,它将结束阻塞循环。 只有在以下条件为真的时候,Windows Sockets DLL 才调用阻塞钩子函数:历程是被定义为可以阻塞的, 指定的套接口也是阻塞套接口,而且请求不能立刻 完成。
图3.1 网络应用进程利用WinSock进行通信
3.1.2 Windows Sockets规范
Windows Sockets 规范是一套开放的、支 持多种协议的Windows下的网络编程接口。从 1991年到1995年,从1.0版发展到2.0.8版, 已成为Windows网络编程的事实上的标准。
阻 塞 是 在 把 应 用 程 序 从 Berkeley 套 接 口 环 境 中 移 植 到 Windows环境中的一个主要焦点。阻塞是指唤起一个函数,该 函数直到相关操作完成时才返回。 在Berkeley套接口模型中,一个套接口的操作的缺省行为是 阻塞方式的,除非程序员显式地请求该操作为非阻塞方式。 在Windows环境下,推荐程序员在尽可能的情况下使用非 阻塞方式(异步方式)的操作。因为非阻塞方式的操作能够更 好地在Windows环境下工作。 Windows是非抢先的多任务环境,即若一个程序不主动放 弃其控制权,别的程序就不能执行。因此在设计Windows Sockets 程序时,尽管系统支持阻塞操作,但还是反对程序员使 用该操作。但由于 SUN 公司下的 Berkeley Sockets 的套接字默 认操作是阻塞的,WINDOWS 作为移植的 SOCKETS 也不可避 免对这个操作支持。
3.错误代码的获得 在UNIX 套接字规范中,如果函数执行时发生 了错误,会把错误代码放到errno或h_errno变量中。 在Winsock中,错误代码可以使用WSAGetLastError() 调用得到。
为了保持与BSD的兼容性,应用程序可以加入 以下一行代码: #define errno WSAGetLastError() 这就保证了用全程的errno变量所写的网络程 序代码在单线程环境中可以正确使用。 当然,这样做有许多明显的缺点:如果一个原 程序包含了一段代码对套接口和非套接口函数都用 errno变量来检查错误,那么这种机制将无法工作。 此外,一个应用程序不可能为errno赋一个新的值 (在Windows Sockets中,WSASetLastError()函数 可以做到这一点)。

3.1.3 WinSock规范与Berkeley套接口的区别
1.套接口数据类型和该类型的错误返回值 在UNIX中,包括套接口句柄在内的所有句柄,都是非负 的短整数,在WinSock规范中定义了一个新的数据类型,称作 SOCKET,用来代表套接字描述符。 typedef u_int SOCKET;
在DOS下,如果没有指定一个指针是near或
far,那么默认是near。所以far指针要显式指 定。在Win32的保护模式默认的是far指针。 什么时候使用far指针? 当使用小代码或小数据存储模式(small)时, 不能编译一个有很多代码或数据的程序。因 为在64K的一个段中,不能放下所有的代码 与数据。为了解决这个问题,需要指定以far 函数或far指针来使用这部分的空间(64K以 外的空间)。
5.重命名的函数 (1)close()改变为closesocket() (2)ioctl()改变为ioctlsocket() 6.Winsock支持的最大套接口数目 在WINSOCK.H中缺省值是64,在编译时由常量FD_SETSIZE 决定。 7.头文件
Berkeley 头 文 件 被 包 含 在 WINSOCK.H 中 。 一 个 Windows Sockets应用程序只需简单地包含WINSOCK.H就足够了。
(3)WinSock 1.1 扩充了Berkeley Socketቤተ መጻሕፍቲ ባይዱ 规范
针对微软 Windows的特点,WinSock 1.1定义 了一批新的库函数,提供了对于消息驱动机制的支 持,有效地利用Windows多任务多线程的机制。见 表3.3 这些扩充主要是提供了一些异步函数,并增加 了符合Windows消息驱动特性的网络事件异步选择 机制。
1.Windows Sockets 1.1版本
在Winsock.h包含文件中,定义了所有 WinSock 1.1版本库函数的语法、相关的符号 常量和数据结构。库函数的实现在 WINSOCK.DLL动态链接库文件中。
(1)WinSock 1.1 全面继承了Berkeley Sockets规范, 见表 3.1
阻塞操作的循环处理步骤: (1)调用 BlockingHook 函数 。 (2)检查使用者是否已调用 WSACancelBlockingCall() 取消了 当前WinSock函数的调用 (3)检查当前WinSock函数的调用是否已完成了? 在 Windows Socket 中,有一个默认的阻塞处理例程(阻塞 钩子函数) BlockingHook() 简单地获取并发送WINDOWS 消息。如果要对复杂程序进行处理,Windows Sockets 中还 有WSASetBlockingHook() 提供用户安装自己的阻塞处理例 程能力;与该函数相对应的则是 WSAUnhookBlockingHook(),它用于删除先前安装的任何 阻塞处理例程,并重新安装默认的处理例程。
例如: 典型的BSD风格: s = socket(...); if (s == -1) /* of s<0 */ {...} 更优良的风格: s = socket(...); if (s == INVALID_SOCKET) {...}
2.select()函数和FD_*宏
select函数的实现有一些变化,每一组套接口仍然用 fd_set类型代表,但它并不是一个位掩码。整个组的套接口 是用了一个套接口数组来实现的。 在Winsock中,使用select()函数时,应用程序应坚持用 FD_XXX宏来设置,初始化,清除和检查fd_set结构。
(5)套接口组:允许应用程序通知底层的服务 提供者一组特定的套接口是相关的。 (6)扩展的字节顺序转换例程:可以针对不同 的协议需求进行多种字节序的转换,具体的 字节顺序由PROTOCL_INFO结构指明。 (7)分散/聚集方式I/O:从多个缓冲区发送与 接收数据。 (8)新增了许多函数。
3.WinSock 1.1中的阻塞问题
(2)数据库函数
表3.2列出了Winsock规范定义的数据库查询例程。 其中六个采用getXbyY()的形式,大多要借助网络上的 数据库来获得信息。 getXbyY()函数都返回一个指针, 指向某种数据结构区域,这些结构区域是由Winsock实 现分配的,用来放置函数返回的数据信息。
要注意:这些指针指向的数据结构数据是易失的, 它们只在该线程的下一个WinSock API调用之前有效。 在一个线程中,只有一份这个结构的副本。因此,应 该在发出下一个WinSock API调用之前把所需的信息复 制出来。
SOCKET可以取从0到INVALID_SOCKET-1之间的任意值。 在socket()例程和accept()例程返回时,检查是否有错误发生 就不应该再使用把返回值和-1比较的方法,或判断返回值是否 为负(这两种方法在BSD中都是很普通,很合法的途径)。取 而代之的是,一个应用程序应该使用常量INVALID_SOCKET, 该常量已在WINSOCK.H中定义。
相关文档
最新文档