欢迎来到天天文库
浏览记录
ID:43486112
大小:330.56 KB
页数:23页
时间:2019-10-08
《WinSock学习笔记》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、WinSock学习笔记作者:肖进整理:丶秀.show2009.91.Socket(套接字)1.1.定义typedefunsignedintu_int;typedefu_intSOCKET;1.2.说明Socket相当于进行网络通信两端的插座,只要对方的Socket和自己的Socket有通信联接,双方就可以发送和接收数据了。其定义类似于文件句柄的定义。1.3.类型1.3.1.流式套接字(streamsocket)定义:#defineSOCK_STREAM1说明:流式套接字提供了双向、有序的、无重复的以及无记录边界的数据流服务,适合处理大量数据。它是面向
2、联结的,必须建立数据传输链路,同时还必须对传输的数据进行验证,确保数据的准确性。因此,系统开销较大。1.3.2.数据报套接字(datagramsocket)定义:#defineSOCK_DGRAM2说明:数据报套接字也支持双向的数据流,但不保证传输数据的准确性,但保留了记录边界。由于数据报套接字是无联接的,例如广播时的联接,所以并不保证接收端是否正在侦听。数据报套接字传输效率比较高。1.3.3.原始套接字(raw-protocolinterface)定义:#defineSOCK_RAW3说明:原始套接字保存了数据包中的完整IP头,前面两种套接字只能收
3、到用户数据。因此可以通过原始套接字对数据进行分析。其它两种套接字不常用,这里就不介绍了。1.4.Socket开发所必要的文件(以WinSockV2.0为例):头文件:Winsock2.h库文件:WS2_32.lib动态库:W32_32.dll2.一些重要的概念2.1.数据类型typedefunsignedcharu_char;typedefunsignedshortu_short;typedefunsignedintu_int;typedefunsignedlongu_long;2.2.网络地址的数据结构有一个旧的和一个新的,请大家留意,如果想知道为
4、什么,请发邮件给BillGate。其实就是计算机的IP地址,不过一般不用点分的IP地址,当然也提供一些转换函数。2.2.1.旧网络地址结构为一个4字节的联合体structin_addr{union{struct{u_chars_b1,s_b2,s_b3,s_b4;}S_un_b;struct{u_shorts_w1,s_w2;}S_un_w;u_longS_addr;}S_un;#defines_addrS_un.S_addr/*canbeusedformosttcp&ipcode*///下面几行省略,反正没什么用处。};�其实完全不用这么麻烦,请看
5、下面:2.2.2.新网络地址结构非常简单,就是一个无符号长整数unsignedlong。举个例子:IP地址为127.0.0.1的网络地址是什么呢?请看定义:#defineINADDR_LOOPBACK0x7f0000012.3.套接字地址结构2.3.1.sockaddr结构定义:structsockaddr{u_shortsa_family;/*addressfamily*/charsa_data[14];/*upto14bytesofdirectaddress*/};说明:sa_family为网络地址类型,一般为AF_INET,表示该socket在
6、Internet域中进行通信,该地址结构随选择的协议的不同而变化,因此一般情况下另一个与该地址结构大小相同的sockaddr_in结构更为常用,sockaddr_in结构用来标识TCP/IP协议下的地址。换句话说,这个结构是通用socket地址结构,而下面的sockaddr_in是专门针对Internet域的socket地址结构。2.3.2.sockaddr_in结构定义:structsockaddr_in{shortsin_family;u_shortsin_port;structin_addrsin_addr;charsin_zero[8];};
7、说明:�sin_family为网络地址类型,必须设定为AF_INET。�sin_port为服务端口,注意不要使用已固定的服务端口,如HTTP的端口80等。如果端口设置为0,则系统会自动分配一个唯一端口。�sin_addr为一个unsignedlong的IP地址。�sin_zero为填充字段,纯粹用来保证结构的大小。补充:�将常用的用点分开的IP地址转换为unsignedlong类型的IP地址的函数:定义:unsignedlonginet_addr(constcharFAR*cp)用法:unsignedlongaddr=inet_addr("192.1
8、.8.84")�如果将sin_addr设置为INADDR_ANY,则表示所有的IP地址,也即所有的计算机。#
此文档下载收益归作者所有