WINDOW SOCKET 学习笔记
WINDOW SOCKET 学习笔记
创建SOCKET和检查是否成功的方法在WINDOES SOCKET中定义了新的一种数据类型SOCKET来表示套接字,套接字的声明如下:typedef usigned int u_inttypedef u_int SOCKETWINDOEWS SOCKETS中除了INVALID_SOCKET不是一个有效的套接字外,在0到INVALID_SOCKET-1之间的数值都是有效的套接字。
只意味着在创建套接字是使用以下代码检测套接字是否创建成功。
SOCKET s =socket();if(INVALID_SOCKET==s){//SOCKET创建失败}******************************************************************************* 网路主机标识的方法和相应的数据结构WINDOWS 系统有一个有用的特征是能够同步支持多种不同的网络协议,由于WINDOWS SOCKETS提供了与协议无关的编程接口,开发人员就可以直接开发使用任何一种协议的网络应用程序了。
但实现网络通信定位和网络连接,任然必须要了解如何为主机定址。
不同的协议有不同的定址方案WINDOWS SOCKET 通过AF_INET地址家族为IP通信定址。
其中"A"代表address,"F"代表family. AF_INET声明如下:#define AF_INET 2在WINDOWS SOCKET 编程中就TCP/IP协议定址是通过IP地址+PORT端口号来实现的,具体是通过SOCKADDR_IN结构来指定IP地址和端口号的,结构声明如下:Struct sockaddr_in{Short sin_family; //表示地址家族(使用的协议类型)(如使用AF_INET表示使用TCP/IP)u_short sin_port; //表示服务的端口号struct in_addr sin_addr; //表示IP地址char sin_zero[8]; // 填充该结构体的大小,使之与SOCKADDR结构大小相同};*****************************************************************************字节顺序转换函数有如下两个实现从主机字节顺序转换为网络字节顺序功能Htonl();和htons();其中“h”代表“host”,”n”代表“net”,”l”代表long,”s”代表“short”,”to”代表转换的意思实现从网络字节顺序转换为主机字节顺序功能的函数有:ntohl();和ntohs();******************************************************************************* 开发套接字应用程序的过程首先进行Window Sockets的初始化,加载Windows Sockets的实现,然后创建套接字,使用套接字,最后关闭套接字,释放Windows Sockets 的实现。
soket基础知识
WinSock基本知识这里不打算系统地介绍socket或者WinSock的知识。
首先介绍WinSock API函数,讲解阻塞/非阻塞的概念;然后介绍socket的使用。
1. WinSock APISocket接口是网络编程(通常是TCP/IP协议,也可以是其他协议)的API。
最早的Socket接口是Berkeley接口,在Unxi操作系统中实现。
WinSock也是一个基于Socket模型的API,在Microsoft Windows操作系统类中使用。
它在Berkeley接口函数的基础之上,还增加了基于消息驱动机制的Windows扩展函数。
Winscok1.1只支持TCP/IP网络,WinSock2.0增加了对更多协议的支持。
这里,讨论TCP/IP网络上的API。
Socket接口包括三类函数:第一类是WinSock API包含的Berkeley socket函数。
这类函数分两部分。
第一部分是用于网络I/O的函数,如accept、Closesocket、connect、recv、recvfrom、Select、Send、Sendto另一部分是不涉及网络I/O、在本地端完成的函数,如bind、getpeername、getsockname、getsocketopt、htonl、htons、inet_addr、inet_nton ioctlsocket、listen、ntohl、ntohs、setsocketopt、shutdow、socket等第二类是检索有关域名、通信服务和协议等Internet信息的数据库函数,如gethostbyaddr、gethostbyname、gethostname、getprotolbynamegetprotolbynumber、getserverbyname、getservbyport。
第三类是Berkekley socket例程的Windows专用的扩展函数,如gethostbyname 对应的WSAAsynGetHostByName(其他数据库函数除了gethostname都有异步版本),select对应的WSAAsynSelect,判断是否阻塞的函数WSAIsBlocking,得到上一次Windsock API错误信息的WSAGetLastError,等等。
Windows Socket API 使用经验
三、socket函数
SOCKET socket(
int af,
int type,
int protocol
);
应用程序调用socket函数来创建一个能够进行网络通信的套接字。第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置PF_INET;第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;第三个参数指定应用程序所使用的通信协议。
);
当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。客户程序一般不必调用bind函数来为其Socket绑定IP地址和断口号。该函数的第一个参数指定待绑定的Socket描述符;第二个参数指定一个sockaddr结构,该结构是这样定义的:
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
sa_family指定地址族,对于TCP/IP协议族的套接字,给其置AF_INET。当对TCP/IP协议族的套接字进行绑定时,我们通常使用另一个地址结构:
struct sockaddr_in {
八、listen函数
int listen( SOCKET s, int backlog );
服务程序可以调用listen函数使其流套接字s处于监听状态。处于监听状态的流套接字s将维护一个客户连接请求队列,该队列最多容纳backlog个客户连接请求。假如该函数执行成功,则返回0;如果执行失败,则返回SOCKET_ERROR。
windows—socket函数整理
Select模型Select模型是Windows sockets中最常见的IO模型。
它利用select函数实现IO 管理。
通过对select函数的调用,应用程序可以判断套接字是否存在数据、能否向该套接字写入数据。
如:在调用recv函数之前,先调用select函数,如果系统没有可读数据那么select函数就会阻塞在这里。
当系统存在可读或可写数据时,select函数返回,就可以调用recv函数接收数据了。
可以看出使用select模型,需要两次调用函数。
第一次调用select函数第二次socket API。
使用该模式的好处是:可以等待多个套接字。
select函数中需要三个fd_set结构:一:准备接收数据的套接字集合,即可读性集合。
二:准备发送数据的套接字集合,即可写性集合。
在select函数返回时,会在fd_set结构中,填入相应的套接字。
readfds数组将包括满足以下条件的套接字:1:有数据可读。
此时在此套接字上调用recv,立即收到对方的数据。
2:连接已经关闭、重设或终止。
3:正在请求建立连接的套接字。
此时调用accept函数会成功。
writefds数组包含满足下列条件的套接字:1:有数据可以发出。
此时在此套接字上调用send,可以向对方发送数据。
2:调用connect函数,并连接成功的套接字。
exceptfds数组将包括满足下列条件的套接字:1:调用connection函数,但连接失败的套接字。
2:有带外(out of band)数据可读。
select函数的使用:在调用select函数对套接字进行监视之前,必须将要监视的套接字分配给上述三个数组中的一个。
然后调用select函数,再次判断需要监视的套接字是否还在原来的集合中。
就可以知道该集合是否正在发生IO操作。
例如:应用程序想要判断某个套接字是否存在可读的数据,需要进行如下步骤:1:将该套接字加入到readfds集合。
2:以readfds作为第二个参数调用select函数。
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入门教程一多线程阻塞式服务器和阻塞式客户端程序
Winsocket入门教程一多线程阻塞式服务器和阻塞式客户端程序最近因为工作需要学习了Winsocket客户端服务器模型程序的设计。
在学习的过程中,我发觉学习Winsocket的资料不多同时十分的零散。
我一直没有找到一本学习Winsocket方面的经典国外著作。
而且这些资料中并没有提供源代码文件,因此我只有将这些源代码在自己敲一遍。
在敲代码的过程中,我发觉了这些源代码中的一些错误的地点和一些差不多过时的Windows程序的输写方法(Win16?)。
现将学习体会和通过阅读各种资料总结出来的模型以及代码分享出来。
期望对学习Winsocket的初学者有一定的关心。
我们第一来了解一下什么是Winsocket。
Winsocket是unix/ linux下的berkeley socket在Windows下的实现。
unix/linux下的berkeley s ocket是网络通讯方面的基石,应用程序通过调用berkeley socket的API进行相互通讯,berkeley socket则利用具体的网络通讯协议和操作系统的调用来为我们完成具体的通讯工作。
Winsocket保留了berkeley socket的所有内容,同时为了其能在Win32消息机制和多线程的环境下更好的工作。
Wins ocket在berkeley socket原有的基础上对其进行了扩充。
如我们能够利用W SAAsyncSelect对Socket消息进行订阅,以及使用WSAGetLastError对多线程环境下的Winsocket错误进行捕捉。
接着再让我们来了解一下服务器\客户端应用程序模型。
该模型是构建分布式系统的模型之一。
服务器程序一直处于监听的状态,等待客户端程序的连接。
客户端程序像服务器程序发送连接要求,服务器程序同意该连接要求,同时与客户端程序建立连接。
现在客户端程序就能够向服务器发送具体的要求,猎取有关的数据。
服务器\客户端模型有三种连接方式,一种是面向连接的(TCP),面向连接的服务是一种可靠的服务,它通过数据流进行数据的传输,面向连接的服务实现了无差错无重复的顺寻数据发送。
Winsocket编程基础
一、网络编程基础1.1计算机网络概述计算机网络把分布在不同地点且具有独立功能的多个计算机系统通过通信设备和线路连接起来,在功能完善的软件和协议的管理下实现网络中资源共享。
在工控领域,现场数据的采集、传输及控制信息的发送都依赖于计算机网络来实现。
1.2、网络参考模型为什么要对网络进行分层设计?在计算机通信过程中需要通信协议,但因传输介质的不同、计算机本身的差异以及数据格式的不同等因素,致使网络通信相当复杂,为了降低复杂性,OSI提出了协议分层的参考模型,即OSI七层互联参考模型。
因为OSI的网络模型标准比较严格,另外推出的时间也相对较晚,所以目前还没有完全按照OSI模型实现的网络。
TCP/IP是目前实际应用最广泛的一种网络模型,在这个模型中,不只是划分了功能层,还有具体的实现技术,即协议。
TCP和IP就是这个模型中最重要的两个层次的代表协议。
1.2.1、OSI和TCP/IP参考模型在网络的不同分层中有不同的协议,计算机只能在同一层次上进行通信,如下图:虽然TCP/IP不是完全符合OSI的参考模型,但在层次上也存在着对应关系,如下图:1.2.2、数据流向在网络的层次模型中,每一层与相邻层之间都留有接口,较低层通过接口为上一层提供服务,中间层就像个翻译一样,如下图为经典的中德教师的对话过程:在TCP/IP网络模型中,数据在从应用层向网络接口层(链路层)传递的过程中,每经过一层都要加入该层的相应的协议内容,这样数据在链路层形成了完整的数据包,该数据包到达接收方后,数据包从链路层到应用层进行逐层解析,在接收方应用层解析得到的数据就是发送方在应用层发送的数据,数据进行逐层封装和解析的过程如下图:1.2.3、IP分类IP地址在网络层中定义,长度为32个二进制位,分为4段,每段8位,用于主机在网络中的标识,IP地址有两部分组成,一部分为网络地址,另一部分为主机地址。
IP地址分为A、B、C、D、E 共5类,具体如下:A 类:|0| + 网络号7位+主机号24位0.0.0.0 ------127.255.255.255B 类:|1 0|+网络号14位+主机号16位128.0.0.0 ------191.255.255.255C 类:|1 1 0|+网络号21位+主机号8位192.0.0.0 ------223.255.255.255D 类:|1 1 1 0|+网络号28位多播组号224.0.0.0 ------239.255.255.255E 类:|1 1 1 1 0|+27位留待后用在使用IP地址进行通信时,可分为单播、组播和广播三种通信方式。
socket学习笔记
1.准备工作1.1.加载ws2_32.dll:1.2指明winsock的版本(调用WSAStartup()):MAKEWORD:类型转换,(2,2)返回0x02022.确定传输的协议:创建套接字socket().af 为地址族(Address Family),也就是IP 地址类型,常用的有AF_INET 和AF_INET6。
.type 为数据传输方式/套接字类型,常用的有SOCK_STREAM(流格式套接字/面向连接的套接字)和SOCK_DGRAM(数据报套接字/无连接的套接字). protocol 表示传输协议,常用的有IPPROTO_TCP 和IPPTOTO_UDP,分别表示TCP 传输协议和UDP 传输协议3.将套接字赋予IP地址和端口3.1服务端:blind():sock 为socket 文件描述符,addr 为sockaddr 结构体变量的指针,addrlen 为addr 变量的大小,可由sizeof() 计算得出addr所指的内容里包含了目的(客户端)IP地址和端口号,将sock里定义的传输协议给addr,实现套接字和地址及端口的绑定。
3.1.1:sockaddr_in结构体的组成1.struct sockaddr_in{2.sa_family_t sin_family;//地址族(Address Family),也就是地址类型3.uint16_t sin_port;//16位的端口号,端口号需要用 htons() 函数转换4.struct in_addr sin_addr;//32位IP地址5.char sin_zero[8];//不使用,一般用0填充6.};可以认为,sockaddr 是一种通用的结构体,可以用来保存多种类型的IP地址和端口号,而sockaddr_in 是专门用来保存IPv4 地址的结构体。
3.2客户端:connect()与blid类似。
4进入被动监听状态,随时响应客户端的请求。
WindowsSocket网络编程——套接字编程原理
WindowsSocket网络编程——套接字编程原理Windows Socket 网络编程——套接字编程原理一、客户机/服务器模式在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。
该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。
客户机/服务器模式在操作过程中采取的是主动请示方式:首先服务器方要先启动,并根据请示提供相应服务:(过程如下)1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求;2、等待客户请求到达该端口;3、接收到重复服务请求,处理该请求并发送应答信号;4、返回第二步,等待另一客户请求;5、关闭服务器。
客户方:1、打开一通信通道,并连接到服务器所在主机的特定端口;2、向服务器发送服务请求报文,等待并接收应答;继续提出请求……3、请求结束后关闭通信通道并终止。
二、基本套接字为了更好说明套接字编程原理,给出几个基本的套接字,在以后的篇幅中会给出更详细的使用说明。
1、创建套接字——socket()功能:使用前创建一个新的套接字格式:SOCKET PASCAL FAR socket(int af,int type,int procotol);参数:af: 通信发生的区域type: 要建立的套接字类型procotol: 使用的特定协议2、指定本地地址——bind()功能:将套接字地址与所创建的套接字号联系起来。
格式:int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);参数:s: 是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。
其它:没有错误,bind()返回0,否则SOCKET_ERROR地址结构说明:struct sockaddr_in{short sin_family;//AF_INETu_short sin_port;//16位端口号,网络字节顺序struct in_addr sin_addr;//32位IP地址,网络字节顺序char sin_zero[8];//保留}3、建立套接字连接——connect()和accept()功能:共同完成连接工作格式:int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR * addrlen);参数:同上4、监听连接——listen()功能:用于面向连接服务器,表明它愿意接收连接。
winSock学习笔记
WinSock学习笔记作者:段力 2008-11-20修改一、基础知识1导入库文件的方法:1.#pragma comment(lib, “wsock32.lib”)2.project->setting->link->categorty->input->object/librarymodules:添加wsock32.lib字符串2).windows socket1.1与Berkeley套接字的不同1.新的数据类型SOCKET标志套接字2.创建程序时使用INV ALID_SOCKET与返回值比较3.使用winsock函数时,判断SOCKET_ERROR4.错误WSAGetlastError();与一般的Win32程序的GetlastError()函数不同;5.重命名了一些BSD的函数closesocket(),ioctlsocker();6.支持的最大套接字数量由FD_SETSIZE决定,默认值64;7.多了消息机制,异步选择函数WSAAsyncSelect();3)windows sockets2的扩展特性1.使用了多个传输协议2.重叠IO和事件对象3.服务的质量(QoS);4.协议无关的多点通信……….4)C/S与B/S1.C/S(Client/Server)客户端与服务器结构任务分配,服务器侦听,客户连接请求,服务器中转信息2.B/S (Brower/Server)浏览器与服务器结构客户端除了浏览器外无需安装任何软件,系统扩展简单,维护与升级方便;5)网络协议TCP/IPOSIIPX/SPXARM红外线通信协议6)端口概念:端口分类:1.通用:0-1023紧密绑定某些服务如80为HTTP通信端口,21为fTP通信端口2.已注册端口:1024-49151.供一般应用程序使用,开发wsock程序时使用这个范围的;3.动态或者私有端口7)调试工具Ping检查TCP/IP能否正常工作,与其他PC是否连通;网络调试助手NetAssis(CM版目前2.7)等软件二、Windows Sockets基础✓ 2.1套接字1)windows sockets套接字定义typedef unsigned int u_int;typedef u_int SOCKET;2)套接字与文件句柄相似,它是代表网络协议中的一组数据的句柄。
Windows操作系统笔记——网络通信
第6章 网络通信6.1 、Winsock 接口通信的双方要建立连接,这个连接的终端就是套接字。
客户端和服务器端都有一个套接字,每个套接字与特定的IP 地址和端口号关联。
Winsock (Windows Sockets )是处理网络的Windows API 。
套接字也就是网络进程的ID 。
网络通信,归根到底还是进程间的通信(不同计算机上的进程间的通信)。
在网络中,每一个节点(计算机或路由器)都有一个网络地址,也就是IP 地址,IP 地址唯一标识网络中的一台计算机。
两个进程通信时,首先要确定各自所在的网络节点或网络地址。
但是,网络地址只能确定进程所在的计算机,而一台计算机上很可能同时运行着多个进程,所以仅凭网络地址还不能确定到底是和网络中的哪一个进程通信,因此套接字还需要其他的信息。
在一台计算机中,一个端口号一次只能分配给一个进程,也就是说,在一台计算机中,端口号和进程之间是一一对应的关系,端口号区别同一台计算机中不同的服务进程。
图 6-1 Socket 的位置关于端口号与进程的关系:为了区分不同应用进程间的网络通信和连接,主要有3个参数:通信的目的IP 地址、使用的传输层协议(TCP 或 UDP)和使用的端口号,这是因为在因特网上使用的计算机的操作系统种类很多,而不同的操作系统又使用不同格式的进程标识符,所以运行在应用层的各种应用进程却不应当让计算机操作系统指派它的进程标识符,这不能唯一标识进程。
为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法对 TCP/IP 体系的应用进程进行标志。
图 6-2 进程与端口号的关系6.2、Winsock编程流程6.2.1、Winsock库的装入、初始化和释放所有的Winsock函数都是从WS2_32.DLL库导出的,VC++在默认情况下并没有连接到该库,如果想使用Winsock API,就必须包含相应的库文件。
#pragma comment(lib,"WS2_32.lib")WSAStartup必须是应用程序首先调用的Winsock函数。
网络编程实训学习总结Socket编程与网络应用开发
网络编程实训学习总结Socket编程与网络应用开发网络编程实训学习总结:Socket编程与网络应用开发网络编程是计算机科学中的一个重要领域,它涉及到数据的传输、通信协议的设计以及网络应用的开发等方面。
在本次的网络编程实训中,我主要学习了Socket编程以及网络应用开发,并在实践中深入理解了这些概念和技术。
在这篇文章中,我将总结我在学习中的心得体会,分享我对于Socket编程与网络应用开发的理解与思考。
一、Socket编程基础Socket编程是一种基于网络通信的编程方式,通过传输控制协议(TCP)或用户数据报协议(UDP)实现进程之间的通信。
在实训中,我首先了解了Socket编程的基本原理和工作方式。
Socket就像是进程之间的一根管道,通过它可以实现数据的传输和通信。
在编程中,我使用Python语言来实现Socket编程,并通过socket库提供的函数和方法来创建、连接、接收和发送数据。
在实践中,我首先学习了TCP Socket编程。
通过创建一个TCP套接字,我能够通过指定服务器的IP地址和端口号来与服务器建立连接。
一旦连接建立成功,我就可以通过调用send()和recv()函数来发送和接收数据。
这样,我就能够实现和服务器的双向通信。
TCP Socket编程的可靠性和稳定性使得它在许多网络应用中得到广泛应用,比如网页浏览、文件传输等。
除了TCP Socket编程外,我还学习了UDP Socket编程。
与TCP不同,UDP是一种无连接的传输协议,它不需要建立和维护连接,因此在数据传输的过程中较为快速。
在UDP Socket编程中,我主要学习了使用sendto()和recvfrom()函数来发送和接收数据。
相比于TCP,UDP更适用于实时性要求较高、数据包丢失可接受的应用,比如音频、视频传输等。
二、网络应用开发在学习了Socket编程的基础知识后,我开始了网络应用开发的学习。
网络应用开发是基于Socket编程的应用实践,通过利用Socket提供的网络通信功能,开发出具有特定功能和服务的网络应用程序。
05第四章 Windows Socket 1
第四章Windows Socket 1.1库函数概览4.1 套接口函数Sockets规范包含了以下Berkeley风格的套接口例程:Windowsaccept()* 响应联结请求,并且新建一个套接口。
原来的套接口则返回监听状态。
bind() 把一个本地的名字和一个无名的套接口捆绑起来。
closesocket()* 把套接口从拥有对象参考表中取消。
该函数只有在SO_LINGER被设置时才会阻塞。
connect()* 初始化到一个指定套接口上的连接。
getpeername() 得到连接在指定套接口上的对等通讯方的名字。
getsockname() 得到指定套接口上当前的名字。
getsockopt() 得到与指定套接口相关的属性选项。
htonl() 把32位的数字从主机字节顺序转换到网络字节顺序。
htons() 把16位的数字从主机字节顺序转换到网络字节顺序。
inet_addr() 把一个Internet标准的"."记号地址转换成Internet地址数值。
inet_ntoa() 把Internet地址数值转换成带"."的ASCII字符串。
ioctlsocket() 为套接口提供控制。
listen() 监听某一指定套接口上连接请求的到来。
ntohl() 把32位数字从网络字节顺序转换为主机字节顺序。
ntons() 把16位数字从网络字节顺序转换为主机字节顺序。
recv()* 从一个已连接的套接口接收数据。
recvfrom()* 从一个已连接的或未连接的套接口接收数据。
select()* 执行同步I/O多路复用。
send()* 从一已连接的套接口发送数据。
sendto()* 从已连接或未连接的套接口发送数据。
setsockopt() 设置与指定套接口相关的属性选项。
shutdown() 关闭一部分全双工的连接。
socket() 创建一个通讯端点并返回一个套接口。
*表示例程在应用于阻塞套接口时会阻塞。
Socket网络编程学习笔记(1):常用方法介绍
Socket网络编程学习笔记(1):常用方法介绍虽然天天上博客园欣赏各位“大侠”的杰作,偶然回首,突然发现自己已成“潜水者”久矣。
本来对于自己有限的水平,有点不好意思在此发贴,不过潜伏久了,才慢慢意识到老是通过浏览他人的文章虽然能够提高自己能力,能够及时的获取新技术新思想,但却只能停留在他人的思想上。
通过学习,加上自己的想法,再写出来,让大家来指证错误,不仅能够巩固自己的知识,也可以让一些跟我一样迷惘的朋友们不用再去走一些弯路,岂不是两全其美,本着这样的想法,打算把自己平时的所学所想都写下来,欢迎各路朋友批评指证,因为你的批评和建议能够让我更迅速的得到提高。
好了,讲了这么多废话,也该言归正传了。
由于工作上需要,最近恶补了一下socket网络编程,整理了一下资料,把它放上来,希望能够对一些朋友有帮助。
在讲Socket编程前,我们先来看一下几个最常用的类和方法,相信这些东西能让你事半功倍。
一、IP地址操作类1、IPAddress类a、在该类中有一个 Parse()方法,可以把点分的十进制IP表示转化成IPAddress类,方法如下:IPAddress address = IPAddress.Parse(“192.168.0.1”);b、IPAddress提供4个只读字段Any 用于代表本地系统可用的任何IP地址Broadcase 用于代表本地网络的IP广播地址Loopback 用于代表系统的回送地址None 用于代表系统上没有网络接口其中IPAddress.Any最常用可以用来表示本机上所有的IP地址,这对于socket服务进行侦听时,最方便使用,不用对每个IP进行侦听了。
而IPAddress.Broadcase可用来UDP 的IP广播,这些具体讲socket时再详细介绍。
2、IPEndPoint类我们可以通过二种构造方法来创建IPEndPoint类:a、IPEndPoint(long address, int port)b、IPEndPoint(IPAddress address, int port)四个属性:AddressAddressFamilyPortMaxPortMinPort这些应该从名字上就很好理解,不再一一介绍。
Windows SOCKET编程汇总
Windows SOCKET编程第一章序言我写这个专题的目的,一方面是为了通过对网络编程再一次系统的总结,提高自己的网络编程水平,特别是Windows下的网络编程水平。
同时,我也希望,能为众多初学网络编程的人提供一点帮助,因为我开始学习网络编程的时候,能找到的资料就很少。
当然,花钱可以买到翻译版本的书:)首先向大家推荐一本很好的参考书,Network Programming for Microsoft Windows 2nd,初学网络编程的时候我还不知道有这样一本好书,只是上各大论坛把能找到的网络编程方面的文章和代码下载下来,然后自己研究。
后来看到别人推荐这一本书,下载了一个,看了感觉非常好,里面的内容写得很规范,条理也很清楚,英文好的朋友可以直接阅读,不然就只好去弄一本翻译好的来研究了。
我试着从Windows编程的基础开始,一直到探索建立高性能的网络应用程序。
我说过,我并不是以高手的身份写这本书,而是以和大家一起学习的心态学习网络编程,写书只是让自己的思路更清晰,以后还可以翻阅。
所以,我不保证书中所有的内容都是绝对正确和标准的,有不妥的地方,还希望高手批评指正。
这本书是完全免费的,读者可以任意使用书中的代码。
但是如果需要转载,请注明原作者和出处。
如果有商业运作的需求,请直接和我联系。
第二章Windows网络编程基础这本书主要探索Windows网络编程,开发平台是Windows 2000 和Visual C++.NET,从一个合格的C++程序员到网络编程高手,还是需要花不少功夫,至少我认为写一个聊天程序很简单,而要写一个能同时响应成千上万用户的高性能网络程序,的确不容易。
这篇文章所介绍的方法也并不是能直接应用于每一个具体的应用程序,只能作为学习的参考资料。
开发高性能网络游戏恐怕是促使很多程序员研究网络编程的原因(包括我),现在的大型网络游戏对同时在线人数的要求比较高,真正的项目往往采取多个服务器(组)负荷分担的方式工作,我将首先把注意力放到单个服务器的情况。
winsocket的基本概念和API函数
winsocket的基本概念和API函数勿在浅沙筑高楼。
在谈论TServerSocket等组件编写之前,这里先对Winsock中一些基本概念和API函数做一个简单的说明。
一、定址要通过Winsock建立通信,必须了解如何利用指定的协议为工作站定址。
Winsock 2引入了几个新的、与协议无关的函数,它们可和任何一个地址家族一起使用;但是大多数情况下,各协议家族都有自己的地址解析机制,要么通过一个函数,要么作为一个投给getsockopt的选项。
因为目前网络编程中用的最多最普遍的也许就是TCP/IP协议了,所以这里主要介绍此协议下的WinSock编程。
1、IP网际协议(Internet Protocol, IP)是一种用于互联网的网络协议,已经广为人知。
它可广泛用于大多数计算机操作系统上,也可用于大多数局域网LAN(比如办公室小型网络)和广域网WAN(比如说互联网)。
从它的设计看来,IP是一个无连接的协议,不能保证数据投递万无一失。
两个比它高级的协议(TCP和UDP)用于依赖IP协议的数据通信。
2、TCP面向连接的通信是通过“传输控制协议”(Transmission Control Protocol, TCP)来完成的。
TCP提供两台计算机之间的可靠无错的数据传输。
应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。
这个连接一旦建立,两台计算机之间就可以把数据当作一个双向字节流进行交换。
3、UDP无连接通信是通过“用户数据报协议”(User Datagram Protocol, UDP)来完成的。
UDP 不保障可靠数据的传输,但能够向若干个目标发送数据,接收发自若干个源的数据。
简单地说,如果一个客户机向服务器发送数据,这一数据会立即发出,不管服务器是否已准备接收数据。
如果服务器收到了客户机的数据,它不会确认收到与否。
[整理]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操作时,如果这些操作既没有成功也没有失败,应用程序会在执行这些操作的地方一直阻塞着。
第二章使用WindowsSockets1
第二章使用Windows Sockets 1.1编程在这一章,我们将介绍如何使用Windows Sockets 1.1编程,并讨论了使用Windows Sockets 1.1编程的一些细节问题。
本章的讨论均是基于Windows Sockets 1.1规范的,在某些方面可能会和第六、七章对Windows Sockets 2的讨论不一致,请读者注意这一区别。
2.1 Windows Sockets协议栈安装检查任何一个与Windows Sockets Import Library联接的应用程序只需简单地调用WSAStartup()函数便可检测系统中有没有一个或多个Windows Sockets实现。
而对于一个稍微聪明一些的应用程序来说,它会检查PATH环境变量来寻找有没有Windows Sockets实现的实例(Windows Sockets.DLL)。
对于每一个实例,应用程序可以发出一个LoadLibrary()调用并且用WSAStartup()函数来得到这个实现的具体数据。
这一版本的Windows Sockets规范并没有试图明确地讨论多个并发的Windows Sockets 实现共同工作的情况。
但这个规范中没有任何规定可以被解释成是限制多个Windows Sockets DLL同时存在并且被一个或者多个应用程序同时调用的。
2.2 套接口2.2.1 基本概念通讯的基石是套接口,一个套接口是通讯的一端。
在这一端上你可以找到与其对应的一个名字。
一个正在被使用的套接口都有它的类型和与其相关的进程。
套接口存在于通讯域中。
通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。
套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。
Windows Sockets规范支持单一的通讯域,即Internet域。
各种进程使用这个域互相之间用Internet协议族来进行通讯(Windows Sockets 1.1以上的版本支持其他的域,例如Windows Sockets 2)。
WindowsSocket学习笔记
Windows Socket学习笔记Socket(套接字)◆先看定义:typedef unsigned int u_int;typedef u_int SOCKET;◆Socket相当于进行网络通信两端的插座,只要对方的Socket和自己的Socket有通信联接,双方就可以发送和接收数据了。
其定义类似于文件句柄的定义。
◆Socket有五种不同的类型:1、流式套接字(stream socket)定义:#define SOCK_STREAM 1流式套接字提供了双向、有序的、无重复的以及无记录边界的数据流服务,适合处理大量数据。
它是面向联结的,必须建立数据传输链路,同时还必须对传输的数据进行验证,确保数据的准确性。
因此,系统开销较大。
2、数据报套接字(datagram socket)定义:#define SOCK_DGRAM 2数据报套接字也支持双向的数据流,但不保证传输数据的准确性,但保留了记录边界。
由于数据报套接字是无联接的,例如广播时的联接,所以并不保证接收端是否正在侦听。
数据报套接字传输效率比较高。
3、原始套接字(raw-protocol interface)定义:#define SOCK_RAW 3原始套接字保存了数据包中的完整IP头,前面两种套接字只能收到用户数据。
因此可以通过原始套接字对数据进行分析。
其它两种套接字不常用,这里就不介绍了。
◆Socket开发所必须需要的文件(以WinSock V2.0为例):头文件:Winsock2.h库文件:WS2_32.LIB动态库:W32_32.DLL一些重要的定义1、数据类型的基本定义:这个大家一看就懂。
typedef unsigned char u_char;typedef unsigned short u_short;typedef unsigned int u_int;typedef unsigned long u_long;2、网络地址的数据结构,有一个老的和一个新的的,请大家留意,如果想知道为什么,请发邮件给Bill Gate。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
创建SOCKET和检查是否成功的方法在WINDOES SOCKET中定义了新的一种数据类型SOCKET来表示套接字,套接字的声明如下:typedef usigned int u_inttypedef u_int SOCKETWINDOEWS SOCKETS中除了INVALID_SOCKET不是一个有效的套接字外,在0到INVALID_SOCKET-1之间的数值都是有效的套接字。
只意味着在创建套接字是使用以下代码检测套接字是否创建成功。
SOCKET s =socket();if(INVALID_SOCKET==s){//SOCKET创建失败}******************************************************************************* 网路主机标识的方法和相应的数据结构WINDOWS 系统有一个有用的特征是能够同步支持多种不同的网络协议,由于WINDOWS SOCKETS提供了与协议无关的编程接口,开发人员就可以直接开发使用任何一种协议的网络应用程序了。
但实现网络通信定位和网络连接,任然必须要了解如何为主机定址。
不同的协议有不同的定址方案WINDOWS SOCKET 通过AF_INET地址家族为IP通信定址。
其中"A"代表address,"F"代表family. AF_INET声明如下:#define AF_INET 2在WINDOWS SOCKET 编程中就TCP/IP协议定址是通过IP地址+PORT端口号来实现的,具体是通过SOCKADDR_IN结构来指定IP地址和端口号的,结构声明如下:Struct sockaddr_in{Short sin_family; //表示地址家族(使用的协议类型)(如使用AF_INET表示使用TCP/IP)u_short sin_port; //表示服务的端口号struct in_addr sin_addr; //表示IP地址char sin_zero[8]; // 填充该结构体的大小,使之与SOCKADDR结构大小相同};*****************************************************************************字节顺序转换函数有如下两个实现从主机字节顺序转换为网络字节顺序功能Htonl();和htons();其中“h”代表“host”,”n”代表“net”,”l”代表long,”s”代表“short”,”to”代表转换的意思实现从网络字节顺序转换为主机字节顺序功能的函数有:ntohl();和ntohs();******************************************************************************* 开发套接字应用程序的过程首先进行Window Sockets的初始化,加载Windows Sockets的实现,然后创建套接字,使用套接字,最后关闭套接字,释放Windows Sockets 的实现。
******************************************************************************* 具体的函数使用(TCP)1WSAStartup()函数不管是客户端还是服务器端,开发Windows Sockets 应用程序是,必须首先加载Windows Sockets动态库(dll).此函数就是实现此项功能,此函数是套接字应用程序必须调用的第一个函数函数声明如下:Int WSAStartup( WORD wVersionRequseted , //指定加载Windows Sockets动态库的版本LPWSADATA lpWSAData //指向LPWSADATA结构的指针,该参数返回被加载动态库的有关信息);在指定准备加载WINDOWS SOCKETS动态库的版本时,高字节指定所需要哭文件的副版本低字节指定主版本。
在应用程序中可以使用MAKEWORD(X,Y)方便指定该参数。
其中X是该高位字节,Y是低位字节。
该函数能够使得应用程序和WINDOWS SOCKET DLL之间能够互相通知对方可以支持的最高版本,以及互相确认对方的版本是否可以接受的。
当该函数返回时,wsaData将输出参数的wSersion值,指示了应用程序将使用的最终版本。
该函数调用成功返回0,否则调用失败WSADATA结构声明如下(用于保存关于被加载动态库的信息)#define WSADESCRIPTION_LEN 256#define WSASYS_STATUS_LEN 128Typedefy struct WSAData{WORD wVersion; //期望使用者使用的版本WORD wHiqhVersion;//DLL最高支持的版本Char szDescription//DLL的描述信息Chat szSystemStatus//DLL的状态信息Usigned short iMaxSockets//一个进程可以打开的套接字最多数量Usigned short iMaxUdpDg//一个进程发送或接受最大的数据包长度Char FAR * lpvendorinfo//厂商专有信息};下面程序是一个支持windows sockets 2.2版本的应用程序调用WSAStarup()函数的过程WORD wVersionRequsted;WSDATA wsaData;Int nErrCode;wVersionRequsted=MAKEWORD(2,2);nErroCode=WSAStarup(wVersionRequsted,&wsData);if(nErron!=0){//没有找到可用的DLLreturn ;}If(LOBYTE(wsData.wVersion)!=2||HIBYTE(wsData.wVersion)!=2)){//没找到可用的DLLWSACleanup();return;}2socket()函数使用初始化windows sockets DLL后,创建套接字。
Socket()函数和WSASocket()函数将实现此项功能。
Socekt函数声明如下:SOCKET socket(int af, //协议的地址家族,创建TCP/IP协议时该参数为AF_INET Int type, //协议套接字的类型Int protocol //协议,使用该字段来限制一个特殊的传输);对于TCP/IP协议来说共有三种套接字类型分别为SOCK_STREAM套接字protocol为IPPROTO_TCPSOCK_DGRAM套接字protocol 为IPPROTO_UDPSOCK_RAM 套接字该函数调用成功后,返回一个新建立的套接字句柄:调用失败则返回INVALID_SOCKET.使用范例:SOCKET S= socket(AF_INET,SOCKET_STREAM,IPPRPTP_TCP);If(INVALID==S){//创建socket失败}3bind()函数的使用bind()函数实现将一个套接字绑定到一个以知的地址。
该函数的声明如下:int bind(SOCKET s, //要绑定的套接字Const struct socketaddr FAR* name, //地址Int namelen //sockaddr结构的长度);该函数调用成功,则返回值为0;否则返回值为SOCKET_ERROR如果应用程序不关心分配给他的地址,则可将地址设置为INADDR_ANY,或将端口号设置为0. Bind()函数的实例用法:SOCKET s;Struct sockaddr_in servAddr;//服务器套接字地址Int nservport;//服务器端口Int nErrorCode;//服务器错误代码servAddr.sin_family=AF_INET;servAddr.sin_addr.S_addr=htonl(INADDR_ANY);servAddr.sin_family=htons(nservport);nErrorCode=bind(s,(SOCKADDR* &servAddr,sizeof(servAddr)));if(nErrorCode==SOCKET_ERROR){//绑定套接字失败}4listen()函数的使用listen函数将套接字设置为监听模式。
其函数声明如下:int listen(SOCKET S, //套接字Int backlog, //指定等待连接的最大长度);当该函数调用成功是,返回的值为0;否则范围SOCKET_ERROR。
当服务器接受一个连接请求时,这个连接请求就从队列中删除5accept()函数的使用accept()函数实现接受一个连接请求功能。
其函数声明如下:SOCKET accept(SOCKET S,Struct sockaddr FAR* addr, //该参数返回请求连接的主机地址Int FAR* addrlen //该参数返回SOCKETADDR_IN结构的长度);当函数成功时返回一个新的套接字句柄。
服务器使用该套接字与客户端进行数据的传输当函数调用失败时,返回INVALID_SOCKET错误。
函数用法如下:SOCKET slisten; //监听套接字SOCKET saccept ; //接受套接字Sockaddr_in addrclient; //客户端地址int addrclientlen=sizeof(addrclient);saccept=accept(slisten,(SOCKADDR*)&addrclient,&addrclientlen);if(INVALID_SOCKET==saccept){//失败处理}6recv()函数的使用recv()函数和WSArecv()用于接受数据声明如下:Int recv(SOCKET s,char FAR* buf,//接受数据的缓冲区int len, //缓冲区得长度int flags// 该参数影响该函数的行为);对于flags参数,该参数可以是0,表示无特殊行为,MSG_PEEK会使用的数据被复制到缓冲区内,但没有从系统缓冲区中将其删除,MSG_OOB表示处理带外数据该函数调用成功返回值为接受的字节数,失败时返回SOCKET_ERROR函数使用例子:SOCKET S;char buf[128];int nreadlen;nreadlen=recv(s,buf,128,0);if(SOCKET_ERROR==nreadlen){//失败处理}7send()函数的使用send()函数和WSASend()函数用于发送数据。