高级套接字编程:带外数据与getaddrinfo函数

需积分: 49 23 下载量 89 浏览量 更新于2024-08-14 收藏 1.29MB PPT 举报
"VC++高级套接字编程教程——最后一个发送方示例及高级套接字编程概念" 在本文档中,我们关注的是VC++环境下的高级套接字编程,特别是如何利用套接字进行数据传输,包括普通数据和带外数据(Out-of-Band, OOB)的发送。首先,我们来看提供的示例代码,它演示了一个简单的TCP发送方程序。 ```cpp int main(int argc, char **argv) { int sockfd; if (argc != 3) err_quit("usage: tcpsend04 <host> <port#>"); sockfd = Tcp_connect(argv[1], argv[2]); Write(sockfd, "123", 3); printf("wrote 3 bytes of normal data\n"); Send(sockfd, "4", 1, MSG_OOB); printf("wrote 1 byte of OOB data\n"); Write(sockfd, "56", 2); printf("wrote 1 byte of normal data\n"); Send(sockfd, "7", 1, MSG_OOB); printf("wrote 1 byte of OOB data\n"); Write(sockfd, "89", 2); printf("wrote 2 byte of normal data\n"); exit(0); } ``` 这段代码首先检查命令行参数,然后通过`Tcp_connect`函数建立到指定主机和端口的连接。接着,它使用`Write`函数发送正常数据,而使用`Send`函数发送带外数据,并通过`MSG_OOB`标志来指示数据是带外的。带外数据通常用于紧急情况,因为它们可以不遵循正常的队列顺序,而是立即被处理。 接下来,我们转向高级套接字编程的一些关键点: 1. **高级名字与地址函数**:传统上,我们使用`gethostbyname`和`gethostbyaddr`来解析主机名或地址,但这些函数已过时,且不适用于多协议环境。取而代之的是`getaddrinfo`函数,它可以同时处理IPv4和IPv6,且是线程安全的。`getaddrinfo`接受主机名、服务名和一个`hints`结构,返回一个`addrinfo`链表,其中包含了所需的地址信息。 2. **addrinfo结构**:`addrinfo`结构体包含了关于网络地址的各种信息,如标志、地址族、套接字类型、协议、地址长度、规范名以及实际的地址等。这个结构体允许程序员灵活地处理各种类型的网络连接。 3. **高级i/o函数**:虽然`Write`和`Send`在这里被用作基本的发送函数,但高级套接字编程可能涉及更多复杂的I/O操作,如异步I/O、缓冲区管理和错误处理。 4. **高级UDP套接字编程**:在TCP套接字之外,UDP套接字提供了无连接的服务,其编程通常涉及到更多的错误处理和包序列化,因为UDP不保证数据的顺序或可靠性。 5. **带外数据**:如上述代码所示,通过设置`MSG_OOB`标志,可以发送带外数据。这在需要紧急通信或者数据优先级较高的场景下非常有用。 总结来说,这个教程深入讲解了VC++环境中高级套接字编程的关键概念,包括高效的名字解析、灵活的I/O操作、UDP套接字的使用以及带外数据的发送。通过学习这些内容,开发者能够构建更复杂、更健壮的网络应用程序。