winsock.doc
上传人:sy****28 上传时间:2024-09-14 格式:DOC 页数:25 大小:131KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

免费试读已结束,剩余 15 页请下载文档后查看

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

一,什么是Socket接触网络编程当然要了解Socket,Socket(套接字)是一种网络编程接口,Socket提供了很多灵活的函数,帮助程序员写出高效的网络应用。Socket分为BSDUNIX和windows两个版本。在win32平台上的Winsock编程都要经过下列基本步骤:定义变量——获得Winsock版本——加载Winsock库——初始化——创建套接字——设置套接字——关闭套接字——卸载Winsock库使用winsock2API编程,必须包含头文件winsock2.h(链接环境WS2_32.LIB),头文件winsock.h(WSOCK32.LIB)是为了兼容winsock1程序时使用的,另外mswsock.h(MSWSOCK.DLL)是微软的扩展类,用于开发高性能的winsock程序。准备好后,你就可以着手建立你的第一个网络程序了。二,Socket编程的基本过程Socket通信分为面向连接的通信(TCP)和面向无连接的通信(UDP),通信流程如下:面向连接的通信无连接的通信1,Winsock初始化和结束每一个winsock应用程序必须首先加载相应的winsockdll版本。方法是调用:intWSAStartup(WORDwVersionRequested,库版本,高字节副版本,低字节主版本LPWSADATAlpWSAData结构指针,函数自动填充该结构。);函数调用成功返回0可以用宏MAKEWORD(x,y)用来指定第一个参数的值2,建立套接字套接字是传输提供者的一个句柄。SOCKETsocket(intaf,inttype,intprotocolIPPROTO_TCP,IPPROTO_UDP,0(如果不想指定));第一个参数指定通信协议的协议族,AF_INET(IPv4)或AF_INET6(IPv6)(因为Socket是网络编程接口而不是一个协议,它使用流行的网络协议(TCP/IP,IPX)为应用程序提供的一个编程接口。)第二个参数指定要创建的套接字的类型。SOCK_STREAM(TCP流套接字),SOCK_DGRAM(UDP数据包套接字),SOCK_RAW(原始套接字)第三个参数指定应用程序所指定应用程序所使用的通信协议。函数成功返回套接字描述符,失败返回INVALID_SOCKET3,配置套接字当创建一个套接字后,再进行网络通信之前,必须先配置Socket。面向连接的客户端Socket通过调用connect函数在Socket数据结构中保存地址和远端信息。无连接客户端,服务端以及面向连接Socket的服务端,通过调用bind函数来配置本地信息。intbind(SOCKETs,创建的套接字conststructsockaddrFAR*name,指向地址缓冲区的指针intnamelen地址缓冲区的大小);成功返回0,失败返回SOCKET_ERROR当创建一个套接字后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。第二个参数指定一个sockaddr结构定义如下:structsockaddr{u_shortsa_family;charsa_data[14];};我们通常使用另外一个等价的地址结构:structsockaddr_in{shortsin_family;u_shortsin_port;structin_addrsin_addr;charsin_zero[8];};其中sin_family是通信协议族,sin_port指明端口号,sin_addr结构中有一个字段s_addr,表示IP地址,该字段是一个整数,一般用函数inet_addr把点分字符串形式的IP地址转化成unsignedlong型的整数值。如果指定为htonl(INADDR_ANY),那么无论哪个网段上的客户机都能与该服务器通信,否则,只有与指定IP地址处于同一网段上的客户机能与该服务器通信。sin_zero[8]为填充,使两个结构大小相同。有一些细节学要说明:在计算机把IP地址和端口号指定成多字节时,这个数是按“主机字节”(host-byte)顺序表示的,不同的处理器对数的表示方法有“大头”(big-endian——最有意义的字节到最无意义的字节)和“小头”(little-endian)两种形式。但是如果在网络上指定IP地址和端口号时,必须按照big-endian的形式,一般称之为“网络字节”(network-byte)顺序。以下几个函数将主机字节顺序转换成网络字节顺序:u_longhtonl(u_longhostlong);intWSAH