WinSocket
Windows网络编程第5章
叫做应用程序编程接口(API )。
➢每个协议提供一系列服务(service),API
则提供特定操作系统中调用这些服务所用
的语法(syntax)。API实现的作用是把
API定义的具体操作和对象映射到协议定义
的抽象服务集上。
➢套接字接口(Socket Interface)就是一种
应用程序可以通过流传递有序的、不重复的数据 。所谓“有序”指数据包按发送顺序送达目的地 址,所谓“不重复”指一个特定的数据包只能获 取一次。
如果必须保证数据能够可靠地传送到目的地、并 且数据量很大时,可以采用流式套接字传输数据 。文件传输协议(FTP)即采用流式套接字传输数 据。
2.数据报式套接字
WinSock的释放
• 在应用程序关闭套接字后,还应调用 WSACleanup函数终止对Windows Sockets DLL 的使用,并释放资源,以备下一次使用。
• WSACleanup函数如下:
int WSACleanup(void); 该函数不带参数,若调用成功则返回0,否则 返回错误码。
wVersionRequested:欲加载Winsock库的版本,可以使用
MAKEWORD(BYTE x, BYTE y)构造WORD,y为高字节,x为低字
节。
lpWSAData:指向WSADATA结构的指针,结构返回加载库 的版本信息。
WSAStartup的调用者和WinSock DLL指明彼此支持的最高版 本,并且确认另一方的版本是否可以接受。
5.1 Socket协议原理
5.1.1 Socket协议的工作原理 5.1.2 Socket的服务方式和类型
5.1.1 Socket协议的工作原理
winsock使用手册
winsock使用手册WinSock(Windows Socket)是一种在Windows系统上开发网络应用程序所使用的应用程序接口(API)。
通过使用WinSock API,开发人员可以创建与互联网协议(IP)网络上的其他计算机进行通信的应用程序。
以下是使用WinSock API的基本步骤:1. 初始化WinSock:在使用WinSock之前,必须初始化WinSock库。
这可以通过调用WSAStartup函数来完成,该函数会加载WinSock库并将其与应用程序关联起来。
2. 创建套接字:要使用WinSock进行通信,必须创建一个套接字。
这可以通过调用socket函数来完成。
该函数接受三个参数:套接字类型(如TCP 或UDP)、套接字协议(如IP协议)以及套接字地址家族(如IPv4或IPv6)。
3. 绑定套接字:创建套接字后,必须将其绑定到一个本地地址和端口上。
这可以通过调用bind函数来完成。
bind函数接受两个参数:一个指向sockaddr结构的指针,该结构包含本地地址和端口信息;以及一个指向套接字描述符的指针。
4. 监听连接:对于TCP套接字,必须调用listen函数来开始监听传入的连接请求。
listen函数接受两个参数:一个指向套接字描述符的指针和一个指定最大连接数的整数。
5. 接受连接:当一个连接请求到达时,必须调用accept函数来接受该请求并返回一个新的套接字描述符。
accept函数接受两个参数:一个指向套接字描述符的指针和一个指向sockaddr结构的指针,该结构用于存储远程地址信息。
6. 发送和接收数据:一旦建立了连接,就可以使用send和recv函数来发送和接收数据。
send函数接受三个参数:一个指向套接字描述符的指针、一个指向要发送数据的缓冲区的指针以及一个指定要发送的数据量的整数。
recv函数也接受类似的参数,用于接收数据。
7. 关闭套接字:完成数据传输后,必须调用close或closesocket函数来关闭套接字并释放资源。
unrecognized windows sockets error 0
“Unrecognized Windows Sockets error 0”是一个常见的Windows Socket错误,通常是由于服务器端口被占用导致的。
以下是两种常见的解决方法:
更改服务器的端口号:到Tomcat目录下的conf文件夹下,找到server.xml文件,然后修改<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />中的端口号。
例如,你可以将端口从8080更改为8088,即<Connector port="8088" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />。
关闭占用当前端口的进程:首先进入命令行,查看端口是否被占用。
运行cmd输入命令:netstat -ano。
找到占用端口的进程PID,然后通过任务管理器或taskkill程序结束该PID 的进程。
请注意,上述步骤需要管理员权限才能执行。
同时,更改服务器端口可能会影响到其他依赖于该端口的应用程序,因此在执行此操作前请确保已经充分了解其潜在影响。
此外,如果这个错误仍然存在,可能需要检查你的防火墙设置或者网络配置,确保没有阻止你的应用程序访问网络。
在某些情况下,重新安装或更新你的网络驱动程序也可能解决这个问题。
WinSocket
Socket网络开发1板书:这节课是自己动手写QQ、自己动手写飞鸽传书的基础,以后想从事网络开发、信息系统开发、游戏开发、嵌入式系统开发等的同学必须学习。
演示一个简单的和网易Email服务器对话的过程。
1、网络基本概念讲解QQ的基本原理讲解浏览器上网的基本原理服务器:Server。
提供服务的计算机。
客户端:Client。
和服务器端交互的一个设备。
IP地址:计算机在网络中的地址。
相当于每个家庭的电话。
211.97.1.2别名、域名:。
域名就相当于你家的地址。
问114,你家的电话(告诉地址)DNS:网络中的114。
Domain Name System。
端口:Port。
不同的程序连接服务器时候用的插座。
(程序和服务器通信的时候的一个开得的一个口子)Socket(套接字):导线、网络连接。
2、WinSock、WinSocket。
Socket:平台无关的。
Socket标准。
所有操作系统都实现了这个标准。
Send、recv。
标准的。
一通百通!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!WinSock:添加了一些Windows独有的函数。
而且不用这些函数的话Socket程序还跑不起来。
羞臊微软!!!WinSock编程:平台无关,一通百通。
WSA(Windows Socket API)3、LastError调用WindowsAPI的时候,每步执行完毕都会把执行结果放到LastError中去,所以应该在函数执行完毕立即去取。
DeleteFile(f1)DeleteFile(f2)GetLastError()LastError只能容纳一个错误码DeleteFile(f1)GetLastError()DeleteFile(f2)GetLastError()错误码。
2233、344555FormatMessage:把错误码转换为错误消息。
Windows错误处理GetLastError1.void ShowError()2.{3.TCHAR* lpMsgBuf;4.FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER| //自动分配消息缓冲区5.FORMAT_MESSAGE_FROM_SYSTEM, //从系统获取信息6.NULL,GetLastError(), //获取错误信息标识7.MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),//使用系统缺省语言8.(LPTSTR)&lpMsgBuf, //消息缓冲区9.0,10.NULL);11.MessageBox(NULL,lpMsgBuf,"",MB_ICONERROR);12.}复制代码在.h中声明函数,在.c中实现!!!都会有哪些错误?4、模板代码:(1)、添加winsock2.h(2)、连接库“wsock32”。
Windows下C语言的Socket编程例子(TCP和UDP)
Windows下C语言的Socket编程例子(TCP和UDP)sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。
在这个程序中,将两个工程添加到一个工作区。
要链接一个ws2_32.lib的库文件。
服务器端编程的步骤:1:加载套接字库,创建套接字(WSAStartup()/socket());2:绑定套接字到一个IP地址和一个端口上(bind());3:将套接字设置为监听模式等待连接请求(listen());4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());5:用返回的套接字和客户端进行通信(send()/recv());6:返回,等待另一连接请求;7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
客户端编程的步骤:1:加载套接字库,创建套接字(WSAStartup()/socket());2:向服务器发出连接请求(connect());3:和服务器端进行通信(send()/recv());4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
函数介绍:1.#include<sys/socket.h>int socket (int family, int type, int protocol);返回值,成功为非负整数,成为套接口描数字;出错为-1、family参数:AF_INET --ipv4;AF_INET6--ipv6;AF_LOCAL--unix域协议;AF_ROUTE--路由socket;AF_KEY--密钥socket;type参数:SOCK_STREAM--字节流套接口SOCK_DGRAM--数据报套接口SOCK_RAM--原始套接口protocal参数一般置为0,当type为SOCK_RAM时不同2.#include<sys/socket.h>int connect (int sockfd, const struct sockaddr* servaddr, socklen_t addlen);返回值,0-成功;-1-出错;servaddr参数可以为sockaddr_in和sockaddr_in6类型,但是都必须强制转化为sockaddr指针类型;connect函数的出错处理:(1)ETIMEOUT-connection timed out 目的主机不存在,没有返回任何相应,例如主机关闭(2)ECONNREFUSED-connection refused(硬错)到达目的主机后,由于各种原因建立不了连接,主机返回RST(复位)响应,例如主机监听进程未启用,tcp取消连接等(3)EHOSTTUNREACH-no route to host(软错)路由上引发了一个目的地不可达的ICMP错误其中(1)(3),客户端会进行定时多次重试,一定次数后才返回错误。
Socket网络编程实验指导
实验七 Socket网络编程一、学时:4二、实验类型:设计性实验三、实验目的:1.熟悉VisualC++的基本操作。
2.基本了解基于对话框的windows应用程序的编写过程。
3.对于Windows Socket编程建立初步概念。
四、实验内容:利用Socket编写聊天程序。
五、实验原理:一、Windows Socket和套接口的基本概念套接口,就是一个指向传输提供者的句柄。
Win32中,套接口不同于文件描述符,所以它是一个独立的类型——SOCKET。
Windows Sockets描述定义了一个Microsoft Windows的网络编程界面,它是从Unix Socket 的基础上发展而来的,为Windows TCP/IP 提供了一个BSD型的套接字规范,除与Unix Sockets完全兼容外,还包括一个扩充文件,通过一组附加的 A PI实现Windows 式(即事件驱动)的编程风格;而Winsock则是在Microsoft Windows 中进行网络应用程序设计的接口。
Windows在Internet支配域中的TCP/IP协议定义了Winsock网络编程规范,融入了许多新特点。
使用Socket的目的是使用户在网络协议上工作而不必对该网络协议有非常深入的了解。
此外,编写的程序还可被迅速地移植到任何支持Socket的网络系统中去。
Winsock提供了一种可为指定传输协议打开、计算和关闭会话的能力。
在Windows下,TCP/IP上层模型在很大程度上与用户的Winsock应用有关;换言之,用户的Winsock应用控制了会话的方方面面,必要时,还会根据程序的需要格式化数据。
套接口有三种类型:流式套接口、数据报套接口及原始套接口。
流式套接口定义了一种可靠的面向连接的服务(利用TCP协议),实现了无差错无重复的顺序数据传输。
数据报套接口定义了一种无连接的服务(UDP 协议),数据通过相互独立的报文进行传输,是无序的,并且不保证可靠和无差错。
Windows Sockets网络编程概述
功能:数据的发送与接收
格式:int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);
int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);
参数说明:
hWnd:窗口句柄
wMsg:需要发送的消息
lEvent:事件(以下为事件的内容)
值:
含义:
FD_READ
期望在套接字上收到数据(即读准备好)时接到通知
FD_WRITE
期望在套接字上可发送数据(即写准备好)时接到通知
FD_OOB
期望在套接字上有带外数据到达时接到通知
FD_ACCEPT
期望在套接字上有外来连接时接到通知
启动函数必须是第一个使用的函数,而且它允许指定Windows Sockets API的版本,并获得SOCKETS的特定的一些技术细节。本结构如下:
int PASCAL FAR WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
其中wVersionRequested保证SOCKETS可正常运行的DLL版本,如果不支持,则返回错误信息。
2.1面向连接的套接字的系统调用时序图
2.2无连接协议的套接字调用时序图
2.3面向连接的应用程序流程图
Windows Socket1.1程序设计
一、简介
Windows Sockets是从Berkeley Sockets扩展而来的,其在继承Berkeley Sockets的基础上,又进行了新的扩充。这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制。
Windows下的socket(套接字编程)
Windows下的socket(套接字编程)前一段时间研究了下模拟网页登陆的相关资料,在此记录防遗忘。
Socket 源于unix,Socket就像我们使用CDC作图一样,免去了程序直接和设备驱动程序打交道的麻烦。
就是提供给我们用来操作底层硬件的接口函数。
工作方式大概描述如下:Socket也即是我们通常所说的套接字,其存在于通信区域中。
通信区域也叫地址族,是一个抽象的概念,主要用于把所有通过套接字通信的进程共有的特性综合在一起,套接字通常之和同一区域的套接字交换数据(当然不同区域的通过转换也能实现)。
而Winsows平台下的socket只支持一个通信区域:AF_INET(网际域),这个域被使用网际协议的进程使用。
这在后面和socket有关的函数很有体现。
说到socket通信就不得不说下关于字节序的问题了。
我们知道现在的硬件平台,对于数据在内存的存储顺序都是低位先存(也就是我们通常所说的主机字节序)。
而在socket有关函数的参数都是要去以高位先存的存储方式的数据(网络字节序)。
那么就需要一个从主机字节需到网络字节序的转换过程。
套接字有三种类型:流式套接字(SOCK_STREAM),基于TCP传输协议,面向连接,可靠的传输方式。
数据报式套接字(SOCK_DGRAM),基于UDP,面向无连接,不可靠。
原始套接字(SOCK_RAW)。
Windows 的socket经历了众多版本的升级变迁,建议使用2以上的版本。
下面就是Windows Socket的编程实现了:客户端/服务端一,基于TCP(面向连接)的socket编程服务端:1,加载套接字库(WSAStartUp)2,创建套接字(socket)3,将套接字绑定到本机的一个地址和端口上(bind)4,将套接字设为监听模式,准备接收客户端请求(listen)5,等待客户请求到来;当请求到来后,接收连接请求,返回一个新的对应于此次连接的套接字(accept)6,返回等待另一客户端的请求。
winsocket基础教程
相信各位读者现在对於 Winsock 的定义、系统环境,以及一些 Winsock Stack及 Winsock 应用程式,都有基本的认识了。
接下来笔者希望能分几期为各位读者介绍一下简单的 Winsock 网路应用程式设计。
我们将以 Winsock 1.1 规格所定义的 46 个应用程式介面(API)为基础,逐步来建立一对 TCP socket 主从架构(Client / Server)的程式。
在这两个程式中,Server 将使用 Winsock 提供的「非同步」(asynchronous)函式来建立 socket 连结、关闭、及资料收送等等;而 Client 则采类似传统 UNIX 的「阻拦式」(blocking)。
由於我们的重点并不在於 MS Windows SDK 的程式设计,所以我们将使用最简便的方式来显示讯息;有关 MS Windows 程式的技巧,请各位读者自行研究相关的书籍及文章。
今天我们先要看一下主从架构 TCP socket 的建立连结(connect)及关闭(close)。
以前笔者曾简单地介绍过主从架构的概念,现在我们再以生活上更浅显的例子来说明一下,读者稍後也较容易能明白笔者的叙述。
我们可以假设Server 就像是电信局所提供的一些服务,比如「104 查号台」或「112 障碍台」。
(1)电信局先建立好了一个电话总机,这就像是呼叫 socket() 函式开启了一个 socket。
(2)接著电信局将这个总机的号码定为 104,就如同我们呼叫 bind() 函式,将 Server 的这个 socket 指定(bind)在某一个 port。
当然电信局必须让用户知道这个号码;而我们的 Client 程式同样也要知道 Server 所用的 port,待会才有办法与之连接。
(3)电信局的 104 查号台底下会有一些自动服务的分机,但是它的数量是有限的,所以有时你会拨不通这个号码(忙线)。
同样地,我们在建立一个 TCP Server socket 时,也会呼叫 listen() 函式来监听等待;listen() 的第二个参数即是 waiting queue 的数目,通常数值是由 1 到 5。
windows socket编程c语言
windows socket编程c语言Windows Socket编程是一种用于在Windows操作系统上进行网络通信的编程技术。
通过使用Windows Socket API,开发人员可以使用C语言来创建网络应用程序,实现网络通信的各种功能。
Windows Socket编程的主要目标是建立和管理网络连接。
它提供了一套函数和数据结构,用于创建和管理套接字(Socket),这是网络通信的基本单元。
套接字可以用于在客户端和服务器之间传输数据,可以是TCP套接字,也可以是UDP套接字。
在Windows Socket编程中,首先需要创建一个套接字。
套接字可以通过调用socket函数来创建,该函数接受三个参数:地址族(AF_INET或AF_INET6),套接字类型(SOCK_STREAM或SOCK_DGRAM)和协议(通常为0)。
创建套接字后,可以使用bind函数将套接字绑定到特定的IP地址和端口号。
一旦套接字被创建和绑定,就可以使用connect函数在客户端和服务器之间建立连接。
对于TCP套接字,可以使用listen函数开始监听连接请求,并使用accept函数接受客户端的连接。
对于UDP套接字,不需要建立连接,可以直接发送和接收数据。
一旦连接建立成功,就可以使用send和recv函数在套接字之间传输数据。
send函数用于将数据发送到远程主机,而recv函数用于接收远程主机发送的数据。
可以使用这两个函数进行双向通信,发送和接收数据。
Windows Socket编程还提供了一些其他的函数和数据结构,用于处理网络通信中的其他问题。
例如,可以使用getaddrinfo函数解析主机名和服务名,以获取对应的IP地址和端口号。
可以使用select函数在多个套接字之间进行多路复用,以实现并发处理。
可以使用ioctlsocket函数设置套接字的属性,例如非阻塞模式。
除了基本的网络通信功能,Windows Socket编程还支持一些高级功能,例如多线程和异步操作。
WindowsSocket接口简介
WindowsSocket接⼝简介 Windows Socket接⼝是Windows下⽹络编程的接⼝,在介绍Windows Socket接⼝之前,⾸先要简单介绍⼀下TCP/IP协议和描述⽹络系统架构的 OSI模型,以及TCP/IP模型。
⼀般来说,⽹络系统的架构可以⽤开放系统互联模型(OSI模型)来描述,OSI模型分层的思想类似于Windows等操作系统的分层,在Windows下,应⽤程序位于最⾼层,应⽤程序通过API调⽤位于中间层次的系统⼦程序,系统⼦程序再调⽤驱动程序,驱动程序最终操作计算机的硬件,各层次之间的隔离有利于层次间的分⼯协作,只要每个层次都严格遵守边界协定,那么它对于其他层次来说就可以看成是⼀个 “ ⿊匣⼦ “,结果就是开发⼈员能够致⼒于本层次的开发和提⾼,⽽不必担⼼能否和其他层次合作。
与之类似, OSI模型的体系结构分为7层,其中⽹络应⽤程序位于最⾼层,通过多个层次最终控制⽹络硬件所在的物理层来收发数据包。
TCP/IP是Transmission Control Protocol/Internet Protocol (传输控制协议/⽹际协议)的缩写,它最初是在20世纪70年代初期由美国国防部出资为ARPA(美国⾼级研究项⽬局)开发的,经过了多年以后,以TCP/IP 协议为基础构建的ARPA⽹逐步演变成了今天的 Internet。
TCP/IP⽹络的架构可以⽤TCP/IP模型来描述,这个模型和OSI模型极为相似,但是它将层次的划分减少到了4层,其每⼀层在功能上和OSI模型的⼀层或多层相对应,两种模型从⼯作原理上看并没有本质的区别。
图16.1描述了OSI模型和TCP/IP模型各层次之间的对应关系,并例举了部分在各层次上⼯作的⽹络协议,读者可以在其中看到很多熟悉的名词,如Telnet,HfTP,TCP和UDP等。
图16.l OSI模型、TCP/IP模型的结构和WinSock接⼝的关系 TCP/IP协议的核⼼协议运⾏于传输层和Internet层上,主要包括TCP, UDP和IP协议,其中TCP协议和UDP协议是以IP协议为基础⽽封装的,这两种协议提供了不同⽅式的数据通信服务。
WindowsSockets错误码列表及出错原因
WindowsSockets错误码列表及出错原因Windows Sockets错误码列表及出错原因错误码的第一部分是用来解决在不同的C编译中对标准C错误码的不一致的定义。
错误码的第二部分是标准Berkeley Sockets错误码的Windows Sockets版本。
错误码的第三部分包括特定Windows Sockets扩充的错误码。
错误码的第四部分由Windows Sockets的getXbyY()和WSAAsyncGetXByY()函数返回,相当于Berkeley软件中由变量h_errno返回的错误(事实上,Windows Sockets在头文件winsock.h中已将h_error定义成其值为WSAGetLastError()的一个宏),它们相当于由域名服务(Domain Name Service)返回的各种失败。
如果Windows Sockets实现没有使用域名服务,它将使用最合适的代码。
一般地,Windows Sockets应用程序应该将错误WSAHOST_NOT_FOUND和WSANO_DATA解释为指示关键字(名字,地址等)没有找着,而错误WSATRY_AGAIN和WSANO_RECOVERY是提醒名字服务自身是非操作的。
错误码由Windows Sockets 规范定义,在所有同一版本规范的Windows Sockets兼容实现中,它们是一致的。
表A.1 Windows Sockets错误码以下英文解释来自MSDN:Error CodesThe following is a list of possible error codes returned by the WSAGetLastError call, along with their extended explanations. Errors are listed in alphabetical order by error macro. Some error codes defined in WINSOCK2.H are not returned from any function - these have not been listed here.WSAEACCES(10013)Permission denied.An attempt was made to access a socket in a way forbidden by its access permissions. An example is using a broadcast address for sendto without broadcast permission being set using setsockopt(SO_BROADCAST).WSAEADDRINUSE(10048)Address already in use.Only one usage of each socket address (protocol/IP address/port) is normally permitted. This error occurs if an application attempts to bind a socket to an IP address/port that has already been used for an existing socket, or a socketthat wasn't closed properly, or one that is still in the process of closing. For server applications that need to bind multiple sockets to the same port number, consider using setsockopt(SO_REUSEADDR). Client applications usually need not call bind at all - connect will choose an unused port automatically. When bind is called with a wild-card address (involving ADDR_ANY), a WSAEADDRINUSE error could be delayed until the specific address is "committed." This could happen with a call to other function later, including connect, listen, WSAConnect or WSAJoinLeaf.WSAEADDRNOTAVAIL(10049)Cannot assign requested address.The requested address is not valid in its context. Normally results from an attempt to bind to an address that is not valid for the local machine. This can also result from connect, sendto, WSAConnect, WSAJoinLeaf, or WSASendTo when the remote address or port is not valid for a remote machine (e.g. address or port 0).WSAEAFNOSUPPORT(10047)Address family not supported by protocol family.An address incompatible with the requested protocol was used. All sockets are created with an associated "address family" (i.e. AF_INET for Internet Protocols) and a generic protocol type (i.e. SOCK_STREAM). This error will be returned if an incorrect protocol is explicitly requested in the socket call, or if an address of the wrong family is used for a socket, e.g. in sendto.WSAEALREADY(10037)Operation already in progress.An operation was attempted on a non-blocking socket that already had an operation in progress - i.e. calling connect a second time on a non-blocking socket that is already connecting, or canceling an asynchronous request (WSAAsyncGetXbyY) that has already been canceled or completed.WSAECONNABORTED(10053)Software caused connection abort.An established connection was aborted by the software in your host machine, possibly due to a data transmission timeout or protocol error.WSAECONNREFUSED(10061)Connection refused.No connection could be made because the target machine actively refused it. This usually results from trying to connect to a service that is inactive on the foreign host - i.e. one with no server application running.WSAECONNRESET(10054)Connection reset by peer.A existing connection was forcibly closed by the remote host. This normally results if the peer application on the remote host is suddenly stopped, the host is rebooted, or the remote host used a "hard close" (see setsockopt for more information on the SO_LINGER option on the remote socket.) This error may also result if a connection was broken due to"keep-alive" activity detecting a failure while one or more operations are in progress. Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET.WSAEDESTADDRREQ(10039)Destination address required.A required address was omitted from an operation on a socket. For example, this error will be returned if sendto is called with the remote address of ADDR_ANY.WSAEFAULT(10014)Bad address.The system detected an invalid pointer address in attempting to use a pointer argument of a call. This error occurs if an application passes an invalid pointer value, or if the length of the buffer is too small. For instance, if the length of an argument which is a struct sockaddr is smaller than sizeof(struct sockaddr).WSAEHOSTDOWN(10064)Host is down.A socket operation failed because the destination host was down. A socket operation encountered a dead host. Networking activity on the local host has not been initiated. These conditions are more likely to be indicated by the error WSAETIMEDOUT.WSAEHOSTUNREACH(10065)No route to host.A socket operation was attempted to an unreachable host. See WSAENETUNREACHWSAEINPROGRESS(10036)Operation now in progress.A blocking operation is currently executing. Windows Sockets only allows a single blocking operation to be outstanding per task (or thread), and if any other function call is made (whether or not it references that or any other socket) the function fails with the WSAEINPROGRESS error.WSAEINTR(10004)Interrupted function call.A blocking operation was interrupted by a call to WSACancelBlockingCall.WSAEINVAL(10022)Invalid argument.Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket - for instance, calling accept on a socket that is not listening.WSAEISCONN(10056)Socket is already connected.A connect request was made on an already connected socket. Some implementations also return this error if sendto is called on a connected SOCK_DGRAM socket (For SOCK_STREAM sockets, the to parameter in sendto is ignored), although other implementations treat this as a legaloccurrence.WSAEMFILE(10024)Too many open files.Too many open sockets. Each implementation may have a maximum number of socket handles available, either globally, per process or per thread.WSAEMSGSIZE(10040)Message too long.A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.WSAENETDOWN(10050)Network is down.A socket operation encountered a dead network. This could indicate a serious failure of the network system (i.e. the protocol stack that the WinSock DLL runs over), the network interface, or the local network itself.WSAENETRESET(10052)Network dropped connection on reset.The connection has been broken due to "keep-alive" activity detecting a failure while the operation was in progress. It can also be returned by setsockopt if an attempt is made to set SO_KEEPALIVE on a connection that has already failed.WSAENETUNREACH(10051)Network is unreachable.A socket operation was attempted to an unreachable network. This usually means the local software knows no route to reach the remote host.WSAENOBUFS(10055)No buffer space available.An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.WSAENOPROTOOPT(10042)Bad protocol option.An unknown, invalid or unsupported option or level was specified in a getsockopt or setsockopt call.WSAENOTCONN(10057)Socket is not connected.A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using sendto) no address was supplied. Any other type of operation might also return this error - for example, setsockopt setting SO_KEEPALIVE if the connection has been reset.WSAENOTSOCK(10038)Socket operation on non-socket.An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was notvalid.WSAEOPNOTSUPP(10045)Operation not supported.The attempted operation is not supported for the type of object referenced. Usually this occurs when a socket descriptor to a socket that cannot support this operation, for example, trying to accept a connection on a datagram socket.WSAEPFNOSUPPORT(10046)Protocol family not supported.The protocol family has not been configured into the system or no implementation for it exists. Has a slightly different meaning to WSAEAFNOSUPPORT, but is interchangeable in most cases, and all Windows Sockets functions that return one of these specify WSAEAFNOSUPPORT.WSAEPROCLIM(10067)Too many processes.A Windows Sockets implementation may have a limit on the number of applications that may use it simultaneously. WSAStartup may fail with this error if the limit has been reached.WSAEPROTONOSUPPORT(10043)Protocol not supported.The requested protocol has not been configured into the system, or no implementation for it exists. For example, a socket call requests a SOCK_DGRAM socket, but specifies astream protocol.WSAEPROTOTYPE(10041)Protocol wrong type for socket.A protocol was specified in the socket function call that does not support the semantics of the socket type requested. For example, the ARPA Internet UDP protocol cannot be specified with a socket type of SOCK_STREAM.WSAESHUTDOWN(10058)Cannot send after socket shutdown.A request to send or receive data was disallowed because the socket had already been shut down in that direction with a previous shutdown call. By calling shutdown a partial close of a socket is requested, which is a signal that sending or receiving or both has been discontinued.WSAESOCKTNOSUPPORT(10044)Socket type not supported.The support for the specified socket type does not exist in this address family. For example, the optional type SOCK_RAW might be selected in a socket call, and the implementation does not support SOCK_RAW sockets at all.WSAETIMEDOUT(10060)Connection timed out.A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.WSATYPE_NOT_FOUND(10109)Class type not found.The specified class was not found.WSAEWOULDBLOCK(10035)Resource temporarily unavailable.This error is returned from operations on non-blocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a non-fatal error, and the operation should be retried later. It is normal for WSAEWOULDBLOCK to be reported as the result from calling connect on a non-blocking SOCK_STREAM socket, since some time must elapse for the connection to be established.WSAHOST_NOT_FOUND(11001)Host not found.No such host is known. The name is not an official hostname or alias, or it cannot be found in the database(s) being queried. This error may also be returned for protocol and service queries, and means the specified name could not be found in the relevant database.WSA_INVALID_HANDLE(OS dependent)Specified event object handle is invalid.An application attempts to use an event object, but the specified handle is not valid.WSA_INVALID_PARAMETER(OS dependent)One or more parameters are invalid.An application used a Windows Sockets function which directly maps to a Win32 function. The Win32 function is indicating a problem with one or more parameters.WSAINVALIDPROCTABLE(OS dependent)Invalid procedure table from service provider.A service provider returned a bogus proc table to WS2_32.DLL. (Usually caused by one or more of the function pointers being NULL.)WSAINVALIDPROVIDER(OS dependent)Invalid service provider version number.A service provider returned a version number other than 2.0.WSA_IO_INCOMPLETE(OS dependent)Overlapped I/O event object not in signaled state.The application has tried to determine the status of an overlapped operation which is not yet completed. Applications that use WSAGetOverlappedResult (with the fWait flag set to false) in a polling mode to determine when an overlapped operation has completed will get this error code until the operation is complete.WSA_IO_PENDING(OS dependent)Overlapped operations will complete later.The application has initiated an overlapped operation which cannot be completed immediately. A completion indication will be given at a later time when the operation has been completed.WSA_NOT_ENOUGH_MEMORY(OS dependent)Insufficient memory available.An application used a Windows Sockets function which directly maps to a Win32 function. The Win32 function is indicating a lack of required memory resources.WSANOTINITIALISED(10093)Successful WSAStartup not yet performed.Either the application hasn't called WSAStartup or WSAStartup failed. The application may be accessing a socket which the current active task does not own (i.e. trying to share a socket between tasks), or WSACleanup has been called too many times.WSANO_DATA(11004)Valid name, no data record of requested type.The requested name is valid and was found in the database, but it does not have the correct associated data being resolved for. The usual example for this is a hostname -> address translation attempt (using gethostbyname or WSAAsyncGetHostByName) which uses the DNS (Domain Name Server), and an MX record is returned but no A record - indicating the host itself exists, but is not directly reachable.WSANO_RECOVERY(11003)This is a non-recoverable error.This indicates some sort of non-recoverable error occurred during a database lookup. This may be because the database files (e.g. BSD-compatible HOSTS, SERVICES orPROTOCOLS files) could not be found, or a DNS request was returned by the server with a severe error.WSAPROVIDERFAILEDINIT(OS dependent)Unable to initialize a service provider.Either a service provider's DLL could not be loaded (LoadLibrary failed) or the provider's WSPStartup/NSPStartup function failed.WSASYSCALLFAILURE(OS dependent)System call failure.Returned when a system call that should never fail does. For example, if a call to WaitForMultipleObjects fails or one of the registry functions fails trying to manipulate theprotocol/namespace catalogs.WSASYSNOTREADY(10091)Network subsystem is unavailable.This error is returned by WSAStartup if the Windows Sockets implementation cannot function at this time because the underlying system it uses to provide network services is currently unavailable. Users should check:•that the appropriate Windows Sockets DLL file is in the current path,•that they are not trying to use more than one Windows Sockets implementation simultaneously. If there is more than one WINSOCK DLL on your system, be sure the first one in the path is appropriate for the network subsystem currently loaded.•the Windows Sockets implementation documentationto be sure all necessary components are currently installed and configured correctly.WSATRY_AGAIN(11002)Non-authoritative host not found.This is usually a temporary error during hostname resolution and means that the local server did not receive a response from an authoritative server. A retry at some time later may be successful.WSAVERNOTSUPPORTED(10092)WINSOCK.DLL version out of range.The current Windows Sockets implementation does not support the Windows Sockets specification version requested by the application. Check that no old Windows Sockets DLL files are being accessed.WSAEDISCON(10094)Graceful shutdown in progress.Returned by WSARecv and WSARecvFrom to indicate the remote party has initiated a graceful shutdown sequence.WSA_OPERATION_ABORTED(OS dependent)Overlapped operation aborted.An overlapped operation was canceled due to the closure of the socket, or the execution of the SIO_FLUSH command in WSAIoctl.Windows Sockets错误码扩展描述下面给出WSAGetLastError()函数返回的可能错误码按字母顺序排列的列表,同时给出简要的扩展描述。
win socket2 例子
win socket2 例子Winsock2 概述Winsock2(Windows 套接字版本 2)是一个 API,用于在Windows 操作系统中进行网络编程。
它提供了低级函数,允许应用程序通过套接字与其他应用程序通信。
创建套接字要创建套接字,使用 `socket()` 函数:```cppSOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);````AF_INET` 指定 IPv4 地址族。
`SOCK_STREAM` 指定这是 TCP 套接字,用于可靠流式通信。
`IPPROTO_TCP` 指定使用 TCP 协议。
绑定套接字要将套接字绑定到特定 IP 地址和端口,使用 `bind()` 函数: ```cppSOCKADDR_IN addr;addr.sin_family = AF_INET;addr.sin_addr.s_addr = INADDR_ANY; // 绑定到所有可用地址addr.sin_port = htons(PORT); // 端口号bind(s, (LPSOCKADDR)&addr, sizeof(addr));````SOCKADDR_IN` 结构包含套接字地址信息。
`INADDR_ANY` 指定绑定到所有可用地址。
`PORT` 是所需的端口号。
`bind()` 将套接字与指定的地址和端口关联。
侦听套接字对于服务器套接字,使用 `listen()` 函数开始侦听连接请求: ```cpplisten(s, SOMAXCONN); // 允许同时等待的最大连接数```接受连接当客户端连接到服务器套接字时,使用 `accept()` 函数接受连接:```cppSOCKET clientSocket = accept(s, NULL, NULL);````accept()` 返回一个新的套接字,与已连接的客户端关联。
发送和接收数据要发送数据,使用 `send()` 函数:```cppint numBytesSent = send(clientSocket, buffer, BUFF_SIZE, 0);````buffer` 是要发送的数据。
无法初始化Windows Sockets接口解决方案
无法初始化Windows Sockets接口解决方案(并简单讨论windows中SFC以及NETSH命令的使用方法)有个同事的电脑不能上网。
用ping命令检测:ping 后,系统提示:无法初始化Windows Sockets接口到网上找了一个解决方案:1、打开一个cmd窗口2、执行命令:SFC/SCANNOW3、执行命令:NETSH WINSOCK RESET按部就班走了一遍之后,问题解决。
然后,进一步查了一下相关的两个命令,sfc命令和netsh命令。
SFC(System file checker)据百度百科讲,系统文件检查器(System file checker)是一个集成在windows系统中的一款工具软件。
这个工具在WIN3.X时代开始集成于操作系统中,并正式出现在Windows 98下。
该软件可以扫描所有受保护的系统文件并验证系统文件完整性,并用正确的Microsoft程序版本替换不正确的版本。
具体的用法可以执行sfc /?进行查询:C:\WINDOWS\system32>sfc /?Microsoft (R) Windows (R) Resource Checker 6.0 版版权所有(C) Microsoft Corporation。
保留所有权利。
扫描所有保护的系统文件的完整性,并使用正确的Microsoft 版本替换不正确的版本。
SFC [/SCANNOW] [/VERIFYONLY] [/SCANFILE=<file>] [/VERIFYFILE=<file>][/OFFWINDIR=<offline windows directory> /OFFBOOTDIR=<offline boot directory>]/SCANNOW 扫描所有保护的系统文件的完整性,并尽可能修复有问题的文件。
/VERIFYONLY 扫描所有保护的系统文件的完整性。
WinSocket网络编程初探
在 no s 境 .客 户 端 和 服 务 器 的 连 接是 通 过 使 用 套 接 dw 环 字接 口建 立 的 。 接 字 是 连 接 的端 点 。 于应 用 程 序 而 言 . 接 套 对 连
() 1 当客 户 端 需 要 某 种 服务 时可 以向 服 务 器 提 交一 个 请 求 。 例如 , f 当 t 户 端 需 要 下 载 一 个 文 件 时 , 需 要 先 发 送 ~ 个 请 p客 它
11C S模 型 概 述 . / 网 络 应用 已经 融 为 日常 生 活 的一 部 分 。 浏览 网页 . 送 邮 如 发
等 待 来 自下 个 客 户 端
一
的 连 接 请 求
图1 / cs模 型
图 2 n0s 的套接字接口 dw 下
12套 接 字 .
2w n o 下 网 络编 程实 例 .id w 2 1 求 .需
C S架 构 下 服 务 器端 监 听 某 特定 端 口 。 客 户 端连 接 。客 户 / 供 是 以 文 件 描 述 符 的 形 式 出 现 的 。 套 接 字 接 口提 供 了 sce0 端 连 接 服 务 器 端 。客 户端 能 够 实现 的功 能 如 下 :. 出服 务 器 端 okt . 1 列
引言
一
1 调 用 WS Satp h 载 套 接 字 库 , 用 sc ef 建 套 接 : A t u0  ̄ r 调 ok t创 1 件等 。 个 网络 应 用 都 可 以 简 化为 客 户 端一 务器 模 型 。 个 应 字 : 每 服 一 用 一 般 是 由一 个 服 务器 端 和 一 个 或 多 个 客 户 端 组成 客 户 端 提 2 调 用 c n e 【 向服 务 器 发 出连 接 请 求 : : on c 0 交 请 求 。 务 端 接 收 请 求 , 向 客 户 端 提供 相 关 的 服 务 。 服 并 例如 . 一 3 建 立 连 接 后 , 用 sn 0 tcf 成 与 服 务 器端 的通 信 : : 调 ed 、 v 完 . ) e
unrecognized windows sockets error
未识别的Windows套接字错误在Windows操作系统中,网络通信是通过套接字(Socket)来实现的。
套接字是一个抽象概念,用于描述应用程序和网络之间的一个端点。
在进行网络通信时,套接字提供了一种标准的接口,以便应用程序能够通过它来发送和接收数据。
然而,在使用Windows套接字编程时,有时会遇到一些套接字错误。
其中之一是“未识别的Windows套接字错误”(unrecognized windows sockets error)。
错误信息及原因当出现“未识别的Windows套接字错误”时,通常会伴随着一个具体的错误代码(error code)。
这个错误代码是一个整数值,用于指示出现错误的具体原因。
不同的错误代码代表了不同的问题,所以我们需要根据错误代码来判断产生错误的原因。
以下是一些常见的错误代码及其可能的原因:•WSANOTINITIALISED(10093):套接字库未初始化。
这可能是因为在尝试使用套接字之前没有正确地初始化套接字库,或者在套接字库已经被关闭后仍然尝试使用套接字。
•WSAENETDOWN(10050):网络下线。
这可能是因为计算机网络连接出现问题,例如网络连接中断或无法访问互联网。
•WSAECONNABORTED(10053):连接中止。
这通常是由于远程主机意外关闭了连接引起的,或者是由于防火墙或网络设备的设置导致连接被中断。
•WSAECONNRESET(10054):连接重置。
这可能是由于远程主机或网络设备强制关闭了连接引起的。
•WSAEAFNOSUPPORT(10047):不支持的地址族。
这可能是由于使用了无效的地址族引起的,例如在IPv4环境下使用IPv6地址。
解决方法针对不同的错误代码,我们可以采取不同的解决方法。
以下是一些常见的解决方法:1.检查套接字库的初始化:如果出现WSANOTINITIALISED错误,我们需要确保在使用套接字之前正确地初始化了套接字库。
WindowsSocket五种IO模型(异步选择)
Winsock 提供了⼀个有⽤的异步I/O模型。
利⽤这个模型,应⽤程序可在⼀个套接字上,接收以Windows消息为基础的络事件通知。
具体的做法是在建好⼀个套接字后,调⽤WSAAsyncSelect函数。
该模型最早出现于Winsock的1.1版本中,⽤于帮助应⽤程序开发者⾯向⼀些早期的16位 Windows平台(如Windows for Workgroups),适应其“落后”的多任务消息环境。
应⽤程序仍可从这种模型中得到好处,特别是它们⽤⼀个标准的Windows例程(常称为 "WndProc"),对窗⼝消息进⾏管理的时候。
该模型亦得到了Microsoft Foundation Class(微软基本类,MFC)对象CSocket的采纳。
(节选⾃《Windows络编程》第⼋章) 还是先贴出代码,然后做详细解释: #include #include #define PORT 5150 #define MSGSIZE 1024 #define WM_SOCKET WM_USER+0 #pragma comment(lib, "ws2_32.lib") LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = _T("AsyncSelect Model"); HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass(&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, // window class name TEXT ("AsyncSelect Model"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL) ; // creation parameters ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg) ; DispatchMessage(&msg) ; } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { WSADATA wsd; static SOCKET sListen; SOCKET sClient; SOCKADDR_IN local, client; int ret, iAddrSize = sizeof(client); char szMessage[MSGSIZE]; switch (message) { case WM_CREATE: // Initialize Windows Socket library WSAStartup(0x0202, &wsd); // Create listening socket sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Bind local.sin_addr.S_un.S_addr = htonl(INADDR_ANY); local.sin_family = AF_INET; local.sin_port = htons(PORT); bind(sListen, (struct sockaddr *)&local, sizeof(local)); // Listen listen(sListen, 3); // Associate listening socket with FD_ACCEPT event WSAAsyncSelect(sListen, hwnd, WM_SOCKET, FD_ACCEPT); return 0; case WM_DESTROY: closesocket(sListen); WSACleanup(); PostQuitMessage(0); return 0; case WM_SOCKET: if (WSAGETSELECTERROR(lParam)) { closesocket(wParam); break; } switch (WSAGETSELECTEVENT(lParam)) { case FD_ACCEPT: // Accept a connection from client sClient = accept(wParam, (struct sockaddr *)&client, &iAddrSize); // Associate client socket with FD_READ and FD_CLOSE event WSAAsyncSelect(sClient, hwnd, WM_SOCKET, FD_READ | FD_CLOSE); break; case FD_READ: ret = recv(wParam, szMessage, MSGSIZE, 0); if (ret == 0 || ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET) { closesocket(wParam); } else { szMessage[ret] = ’\0’; send(wParam, szMessage, strlen(szMessage), 0); } break; case FD_CLOSE: closesocket(wParam); break; } return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } WSAAsyncSelect是最简单的⼀种Winsock I/O模型(之所以说它简单是因为⼀个主线程就搞定了)。
winsocket编程例子
winsocket编程例子Winsock是Windows操作系统提供的一组接口,用于开发网络应用程序。
它是“Windows Socket”的缩写,其作用是使开发者可以基于TCP/IP 协议栈来构建高性能的网络应用程序。
在本文中,我们将介绍Winsock 编程的基础知识,并通过一个实例来演示其使用方法。
第一步是引入头文件和库文件。
在开始编写Winsock程序之前,我们需要引入相应的头文件和库文件,以便在程序中使用Winsock接口。
头文件可以通过以下方式引入:c#include <winsock2.h>#include <ws2tcpip.h>而库文件可以在项目属性中进行设置,或者使用#pragma comment指令自动链接库文件:c#pragma comment(lib, "ws2_32.lib")第二步是初始化Winsock库。
在使用Winsock接口之前,我们需要调用WSAStartup函数来初始化Winsock库。
该函数的原型如下:cint WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)其中,wVersionRequested参数指定所需的Winsock版本号,一般使用MAKEWORD宏来指定版本号,如:cWORD version = MAKEWORD(2, 2);lpWSAData参数用于接收初始化结果的信息,我们可以将其声明为一个WSADATA结构的指针,如:cWSADATA wsaData;初始化完成后,我们可以通过判断返回值来确定初始化是否成功。
如果成功,函数返回0;否则,返回一个错误码。
第三步是创建套接字。
套接字是进行网络通信的关键对象,我们需要调用socket函数来创建一个套接字。
该函数的原型如下:cSOCKET socket(int af, int type, int protocol)其中,af参数指定地址族,一般使用AF_INET表示IPv4地址族;type 参数指定套接字类型,常用的有SOCK_STREAM(面向连接的可靠传输)和SOCK_DGRAM(无连接的不可靠传输);protocol参数指定协议,一般使用0表示自动选择适合的协议。
[整理]Winsocket入门教程一:多线程阻塞式服务器和阻塞式客户端程序(TCP).
Winsocket入门教程一:多线程阻塞式服务器和阻塞式客户端程序(TCP) 收藏我们首先来了解一下什么是Winsocket。
Winsocket是unix/linux下的berkeley socket在Windows下的实现。
unix/linux下的berkeley socket是网络通讯方面的基石,应用程序通过调用berkeley socket的API进行相互通讯,berkeley socket则利用具体的网络通讯协议和操作系统的调用来为我们完成具体的通讯工作。
Winsocket保留了berkeley socket的所有内容,并且为了其能在Win32消息机制和多线程的环境下更好的工作。
Winsocket在berkeley socket 原有的基础上对其进行了扩充。
如我们可以利用WSAAsyncSelect对Socket消息进行订阅,以及使用WSAGetLastError对多线程环境下的Winsocket错误进行捕获。
接着再让我们来了解一下服务器\客户端应用程序模型。
该模型是构建分布式系统的模型之一。
服务器程序一直处于监听的状态,等待客户端程序的连接。
客户端程序像服务器程序发送连接请求,服务器程序接受该连接请求,同时与客户端程序建立连接。
此时客户端程序就可以向服务器发送具体的请求,获取相关的数据。
服务器\客户端模型有三种连接方式,一种是面向连接的(TCP),面向连接的服务是一种可靠的服务,它通过数据流进行数据的传输,面向连接的服务实现了无差错无重复的顺寻数据发送。
一种是面向无连接的(UDP),面向无连接的服务是一种不可靠的服务,它通过数据报进行数据传输,由于数据报进行传输时的顺序是无序的,所以它是不可靠的服务。
最后一种是多播的方式,及服务器程序主动向多个客户端程序发送信息。
面向连接的服务器\客户端应用程序模型的程序流程图如下所示:在此模型的阻塞模式中,服务端程序在执行accept操作、客户端程序connect操作、以及服务端\客户端在进行read和write操作时,如果这些操作既没有成功也没有失败,应用程序会在执行这些操作的地方一直阻塞着。
windows下closesocket和shutdown
windows下closesocket和shutdown以下描述主要是针对windows平台下的TCP socket而言。
首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP 连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包(FIN,RST等),具体的交换过程可以看TCP协议,这里不详细描述了。
而关闭socket是指关闭用户应用程序中的socket句柄,释放相关资源。
但是当用户关闭socket句柄时会隐含的触发TCP连接的关闭过程。
TCP连接的关闭过程有两种,一种是优雅关闭(graceful close),一种是强制关闭(hard close或abortive close)。
所谓优雅关闭是指,如果发送缓存中还有数据未发出则其发出去,并且收到所有数据的ACK之后,发送FIN包,开始关闭过程。
而强制关闭是指如果缓存中还有数据,则这些数据都将被丢弃,然后发送RST包,直接重置TCP连接。
下面说一下shutdown及closesocket函数。
shutdown函数的原型是:int shutdown(SOCKET s,int how);该函数用于关闭TCP连接,但并不关闭socket句柄。
其第二个参数可以取三个值:SD_RECEIVE,SD_SEND,SD_BOTH。
SD_RECEIVE表明关闭接收通道,在该socket上不能再接收数据,如果当前接收缓存中仍有未取出数据或者以后再有数据到达,则TCP 会向发送端发送RST包,将连接重置。
SD_SEND表明关闭发送通道,TCP会将发送缓存中的数据都发送完毕并在收到所有数据的ACK后向对端发送FIN包,表明本端没有更多数据发送。
这个是一个优雅关闭过程。
SD_BOTH则表示同时关闭接收通道和发送通道。
closesocket函数的原型是:int closesocket(SOCKET s);该函数用于关闭socket句柄,并释放相关资源。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TCP/IP技术1Socket概述网络API1981年产生于BSD4.1BSD Socket与Window Socket(WinSock)数据的接收与发送类似于文件的读与写操作连接相互通信的两台主机上的Socket通常以库的形式实现(静态库与动态库)–如何引用: .h, .lib(或.dll)通常提供两种服务:数据报(datagram)与流(stream)2端点地址(Endpoint addresses)每对连接的Socket共有五个部分组成:–协议,本地地址,本地端口,远端地址,远端端口具体的调用:–协议:socket–本地地址,端口:bind–远端地址,端口:connect, sendto3地址转换内部表示(数字表示):32位长整主机名字到数字表示(域名查询):gethostbyname()十进制点分表示到数字表示:inet_addr()数字表示到十进制点分表示:inet_ntoa()数据结构:struct sin_addr{u_long s_addr; // 32 位长整}struct sockaddr_in{short sin_family; // AF_INETu_short sin_port;struct sin_addr sin_addr; // network address}4数据转换多字节数据类型的字节顺序:(如长整型,短整型)–Little Endian: 低位字节在前(Least Significant Byte First)DEC, INTEL–Big Endian: 高位字节在前(Most Significant Byte First) SUN, HP, SGI网络字节顺序:Big Endian可移植性要求转换函数:H: 主机,N:网络,S: short, L: long–主机到网络,即发送时:htons, htonl–网络到主机,即接收时:ntohs, ntohl思考:发送字符串数据需要转换吗,包头中的端口号,长度域呢?56基于Socket 的C/S 交互模型(TCP)S=socket()S=socket() t=accept(s, )t=accept(s, )bind(s,)bind(s,) listen(s, )listen(s, ) read(t, )read(t, ) write(t, )write(t, ) close(t) close(t) 服务器S=socket() S=socket() read(s, ) read(s, ) connect(s, ) connect(s, ) write(s,) write(s,) close(s) close(s) 客户连接建立阻塞请求应答计算7基于Socket 的C/S 交互模型(UDP)S=socket()S=socket() bind(s,)bind(s,) recvfrom(t, )recvfrom(t, )sendto(t, )sendto(t, ) close(t) close(t) 服务器S=socket() S=socket() recvfrom(s, )recvfrom(s, )sendto(s,) sendto(s,) close(s)close(s) 客户请求应答计算创建一个Socket就象文件描述符,socket描述符的类型为:intint socket(int domain, int type, int protocol)domain: AF_INETtype:SOCK_STREAM: TCPSOCK_DGRAM: UDPSOCK_RAW: IPprotocol: 0调用实例:#include <sys/types.h>#include <sys/socket.h>if((s=socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("Socket");}8与端口关联:bind()函数通常用于服务器端将打开的Socket与某一具体的端口相关联int bind(int sockfd, struct sockaddr*my_addr, int addrlen);–出错时返回-1使用举例:int sockfd;struct sockaddr_in my_addr;sockfd= socket(AF_INET, SOCK_STREAM, 0);my_addr.sin_family= AF_INET; /* host byte order */my_addr.sin_port= htons(MYPORT); /* short, network byte order */my_addr.sin_addr.s_addr= inet_addr("132.241.5.10");bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));简化:my_addr.sin_port= 0; // 主机自主选择一个可用的端口my_addr.sin_addr.s_addr= INADDR_ANY; //即0, 主机会自动填9listen()函数仅用于TCP服务器int listen(int sockfd, int backlog);错误时返回-1, 成功返回0为申请进入的连接建立输入数据队列,等待accept()函数的处理Backlog表示队列中允许等待的连接数, 如5-10等当队列中的申请连接数超过backlog时,拒绝连接请求10accept()函数让服务器接受客户方的连接请求,产生一个新的套接字,称为连接套接字,建立TCP连接,原套接字称为监听套接字int accept(int sockfd, struct sockaddr*addr, int*addrlen);错误时返回-1, 成功时返回新的套接字,即连接套接字实例:–bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));listen(sockfd, BACKLOG);sin_size = sizeof(struct sockaddr_in);new_sockfd= accept(sockfd, &their_addr, &sin_size);11connect()函数用于启动和远程主机的直接连接int connect(int sockfd, struct sockaddr*serv_addr, int addrlen);成功返回0, 错误返回-1实例:#define DEST_IP “192.168.1.20"#define DEST_PORT 23int sockfd;struct sockaddr_in dest_addr; // 目的地址sockfd= socket(AF_INET, SOCK_STREAM, 0);dest_addr.sin_family= AF_INET;dest_addr.sin_port= htons(DEST_PORT);dest_addr.sin_addr.s_addr= inet_addr(DEST_IP);connect(sockfd, (struct sockaddr*)&dest_addr, sizeof(struct sockaddr));12数据传输函数send()和recv()用于TCP套接字int send(int sockfd, void *buf, int len, int flags);–buf中包含要传输的数据, len为数据长度–flags: 0: 常规数据,相当于write()函数,MSG_OOB: 带外数据–调用成功,返回发送数据的长度,否则返回-1–若数据较大,有时需发送多次,即多次调用sendint recv(int sockfd, void *buf, int len, int flags);–Buf为接收数据缓冲区,len为缓冲区的大小–Flags: 0:常规则操作,相当于read(), MSG_OOB: 只读取带外数据,MSG_WAITALL: 接收缓冲区填满后才返回实例:char *msg= "Hello, World“, buf[MAX_SIZE];int len, bytes_sent,bytes_recv;.len= strlen(msg);bytes_sent = send(sockfd, msg, len, 0);.bytes_recv= recv(sockfd, buf, MAX_SIZE, 0) ;13数据传输函数sendto()和recvfrom()用于UDP套接字int sendto(int sock, void *msg, int len, int flags,struct sockaddr*to, int addrlen);–同send()相比,增加了两个域,远端地址,及地址长度–调用成功,返回发送数据的长度,否则返回-1int recvfrom(int sock,void *buf, int len,int flags,struct sockaddr*from, int*fromlen);–同recvfrom()相比,增加了两个域,远端地址,及地址长度14关闭套接字close()close(int sockfd);同文件的关闭15Windows Socket(winsock)版本:1.1 à最新2.2, 向下兼容与Berkerly socket基本兼容Berkerly socket àWinsock–头文件:Socket: #include <netinet/in.h>#include <sys/socket.h>Winsock: #include <winsock2.h>–前后增加两个调用:WSAStartup(), WSACleanup()–close()调用变为: closesocket();VC: 库文件,ws2_32.lib16(11) Windows Sockets的特殊函数在Windows Sockets提供的所有函数中,如下两个函数是必须的。
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) Int WSACleantup(void)WSAStartup():该函数必须是Windows Sockets应用程序第一个调用的Windows Sockets函数。