找论文网 > 计算机论文 > 计算机应用 >

Winsock API 选项配置(1)

摘  要 介绍了Winsock 下的网络编程API函数的网络参数以及一些基本的环境配置。同时也可以了解到一些基本的网络特性,给出了网络配置的基本形式,从而更好地对网络通讯进行有效地配置管理。在面对大量烦琐的网络函数与参数的同时,总结出了一些配置它们的方法。
    关键词 套接字;Winsock;地址族;协议族;
 
1  网络编程接口
    为了方便网络编程,20世纪90年代初,由Microsoft联合了其他几家公司共同制定了一套Windows下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。
    通讯的基石是套接字,一个套接字是通讯的一端。在这一端上可以找到与其对应的一个地址名。一个正在被使用的套接字都有它的类型和与其相关的进程。套接字存在于通讯域中。通讯域可以是抽象的概念,它是套接字的一套完备的系列,最后可以通过程序来实现。套接字通常和同一个域中的套接字交换数据。Windows Sockets规范支持单一的通讯域,即Internet域。
    套接字可以根据通讯性质分类,程序员可以根据具体的情况进行设置。一般我们仅在同一类的套接字间通讯。可以通过配置底层文件,让不同类型的套接字间也照样可以通讯。
目前socket提供可以使用两种套接字类型,即流套接字(TCP)和数据报套接字(UDP)。流套接字提供了双向的,有序的,无重复并且无记录边界的数据流服务。他在数据传输当中保证数据的完整性和可靠性等。数据报即UDP套接字支持双向的数据流,但并不保证是可靠,有序,无重复。
2  用于连接套接字API
    Windows Sockets 规范支持的套接字属性选项都可以在对setsockopt()函数和getsockopt()函数的配置中实现。任何关于Sockets 实现必须能够识别所有这些属性选项,并且对每一个属性选项都返回合理的数值。
int setsockopt(
  SOCKET s,
  int level,
  int optname,
  const char* optval,
  int optlen
);
    一般来讲,我们可以手动地对socket进行配置,但是在大多数情况下,socket的默认配置可以解决绝大多数的网络问题,只有我们需要一些特殊的用途时才会用到它。
3  套接字函数
    让套接字工作,其过程如下:
    服务器首先启动,通过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度(这个长度通常有最大的限制),之后就调用accept()来接收连接.客户在建立套接字后就可调用connect()和服务器建立连接.一旦建立连接,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。数据收发完毕之后,调用close()关闭套接字。
3.1  socket()
    int socket(int domain, int type, int protocol);
    参数domain指定套接字使用的协议族,AF_INET表示使用TCP/IP协议族,AF_UNIX表示使用Unix协议族,AF_ISO表示套接字使用ISO协议族,一般只要使用TCP/IP就可以了。type指定套接字类型,一般的面向连接通信类型(如TCP)设置为SOCK_STREAM,当套接字为数据报类型时,type应设置为SOCK_DGRAM,如果是可以直接访问IP协议的原始套接字则type应设置为SOCK_RAW。参数protocol一般设置为"0",表示使用默认协议。当socket()函数成功执行时,返回一个对这个套接字的描述符,如果出错则返回"-1",并设置errno为相应的错误类型。
    在通常情况下,首先要将描述服务器信息的套接字地址结构清零,这个地址结构将常用的地址信息储存在一个结构里面以供调用,我们可以直接在地址结构中填入相应的内容,准备接受客户机送来的连接建立请求。Winsock定义了一种通用的套接字地址结构:
struct sockaddr
{
unsigned short sa_family; /* address type */
char sa_data[14]; /* protocol address */
}
    其中sa_family意指套接字使用的协议族地址类型,对于一般的TCP/IP网络,其值应该是AF_INET,sa_data是存储地址协议信息的数组,不同的协议族有不同的地址,但是都可以存在这个通用的结构体里面,通常的做法是将不同的协议转换成相同的协议地址,然后再进行通讯。
用于TCP/IP协议族的套接字地址结构是sockaddr_in,其定义为:
struct sockaddr_in{
  short sin_family;
  unsigned short sin_port;
  IN_ADDR sin_addr;
  char sin_zero[8];
};
    其中sin_zero成员并未使用,它是为了和通用套接字地址struct sockaddr兼容性而设定的。在编程中,一般都通过bzero()或是memset()将其置零。
    servaddr.sin_family = AF_INET;
    表示套接字使用TCP/IP协议族。
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    设置服务器套接字的IP地址为特殊值INADDR_ANY,表示服务器愿意接收来自任何网络设备接口的客户机连接。htonl()函数将主机顺序的字节转换成网络顺序的字节。
    servaddr.sin_port = htons(PORT);
    设置通信端口号,PORT 即用于通讯的端口号。
3.2  bind()
将一本地地址与一套接字捆绑。
int bind(
  SOCKET s,
  const struct sockaddr* name,
  int namelen
);
    s:未绑定的套接字。
name:套接字地址。
sockaddr 结构定义如下:
struct sockaddr{
u_short sa_family;
char sa_data[14];
};
namelen:name 名字的长度。
    本函数适用于未连接的数据报或流类套接字,在listen()调用前使用。当用socket()创建套接字后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接字分配一个本地名字来为套接字建立本地捆绑。
    如果端口号置为0,则Winsock将给应用程序分配一个值在1024 到5000 之间的端口号。应用程序可在bind()后用getsockname()来获知所分配的地址,但getsockname()只有在套接字连接成功后才会正确的得到分配的地址。
3.3  listen()
    int listen(int sockfd, int backlog);
    参数sockfd指定要求转换的套接字描述符,参数backlog设置请求队列的最大长度。函数listen()主要完成以下操作:
  首先是将套接字转换成监听套接字。客户机可以通过调用函数connect()来使用这样的套接字主动和服务器建立连接。而listen()可将一个服务端尚未连接的主动套接字转换成为这样的"被动"套接字,也就是监听套接字。在执行了listen()函数之后,服务器的TCP就由CLOSED变成LISTEN状态了。另外listen()可以设置连接请求队列的最大长度。TCP协议为每个倾听套接字实际上维护两个队列,一个是未完成连接队列,这个队列中的成员都是未完成3次握手的连接;另一个是完成连接队列,这个队列中的成员都是虽然已经完成了3次握手,但是它是还未被服务器调用accept()接收的连接。参数backlog指定的是这个倾听套接字完成连接队列的最大长度。
 

共2页: 1 [2] 下一页


主动数据库在装备仓库管理系统中的应用
公文流转系统的研究
工商管理 | 工科论文 | 财务管理 | 管理学 | 公共管理 | 财政税收 | 证券金融 | 会计审计 | 计算机 | 法律论文 | 医药学 | 汉语言文学
社会论文 | 工科论文 | 理科论文 | 文化论文 | 艺术论文 | 文学论文 | 哲学论文 | 政治论文 | 英语论文 | 写作指导 | 计算机应用
www.zlunwen.com 找论文网 ® 版权所有 网站地图