预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共11页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

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

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

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

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

基本TCP套接字编程讲解 基于TCP的套接字编程的所有客户端和服务器端都是从调用socket开始,它返回一个套接字描述符。客户端随后调用connect函数,服务器端则调用bind、listen和accept函数。套接字通常使用标准的close函数关闭,但是也可以使用shutdown函数关闭套接字。下面针对套接字编程实现过程中所调用的函数进程分析。以下是基于TCP套接字编程的流程图: socket函数 套接字是通信端点的抽象,实现端对端之间的通信。与应用程序要使用文件描述符访问文件一样,访问套接字需要套接字描述符。任何套接字编程都必须调用socket函数获得套接字描述符,这样才能对套接字进行操作。以下是该函数的描述: /*套接字*/ /* *函数功能:创建套接字描述符; *返回值:若成功则返回套接字非负描述符,若出错返回-1; *函数原型: */ #include<sys/socket.h> intsocket(intfamily,inttype,intprotocol); /* *说明: *socket类似与open对普通文件操作一样,都是返回描述符,后续的操作都是基于该描述符; *family表示套接字的通信域,不同的取值决定了socket的地址类型,其一般取值如下: *(1)AF_INETIPv4因特网域 *(2)AF_INET6IPv6因特网域 *(3)AF_UNIXUnix域 *(4)AF_ROUTE路由套接字 *(5)AF_KEY密钥套接字 *(6)AF_UNSPEC未指定 * *type确定socket的类型,常用类型如下: *(1)SOCK_STREAM有序、可靠、双向的面向连接字节流套接字 *(2)SOCK_DGRAM长度固定的、无连接的不可靠数据报套接字 *(3)SOCK_RAW原始套接字 *(4)SOCK_SEQPACKET长度固定、有序、可靠的面向连接的有序分组套接字 * *protocol指定协议,常用取值如下: *(1)0选择type类型对应的默认协议 *(2)IPPROTO_TCPTCP传输协议 *(3)IPPROTO_UDPUDP传输协议 *(4)IPPROTO_SCTPSCTP传输协议 *(5)IPPROTO_TIPCTIPC传输协议 * */ connect函数 在处理面向连接的网络服务时,例如TCP,交换数据之前必须在请求的进程套接字和提供服务的进程套接字之间建立连接。TCP客户端可以调用函数connect来建立与TCP服务器端的一个连接。该函数的描述如下: /* *函数功能:建立连接,即客户端使用该函数来建立与服务器的连接; *返回值:若成功则返回0,出错则返回-1; *函数原型: */ #include<sys/socket.h> intconnect(intsockfd,conststructsockaddr*servaddr,socklen_taddrlen); /* *说明: *sockfd是系统调用的套接字描述符,即由socket函数返回的套接字描述符; *servaddr是目的套接字的地址,该套接字地址结构必须包含目的IP地址和目的端口号,即想与之通信的服务器地址; *addrlen是目的套接字地址的大小; * *如果sockfd没有绑定到一个地址,connect会给调用者绑定一个默认地址,即内核会确定源IP地址,并选择一个临时端口号作为源端口号; */ TCP客户端在调用函数connect前不必非得调用bind函数,因为内核会确定源IP地址,并选择一个临时端口作为源端口号。若TCP套接字调用connect函数将建立TCP连接(执行三次握手),而且仅在连接建立成功或出错时才返回,其中出错返回可能有以下几种情况: 若TCP客户端没有收到SYN报文段的响应,则返回ETIMEOUT错误; 若客户端的SYN报文段的响应是RST(表示复位),则表明该服务器主机在我们指定的端口上没有进程在等待与之连接。只是一种硬错误,客户端一接收到RST就立即返回ECONNERFUSED错误; RST是TCP在发生错误时发送的一种TCP报文段。产生RST的三个条件时: 目的地为某端口的SYN到达,然而该端口上没有正在监听的服务器; TCP想取消一个已有连接; TCP接收到一个不存在的连接上的报文段; 若客户端发出的SYN在中某个路由器上引发一个目的地不可达的ICMP错误,这是一个软错误。客户端主机内核保存该消息,并在一定的时间间隔继续发送SYN(即重发)。在某规定的时间后仍未收到响应,则把保存的消息(即ICMP错误)作为EHOSTUNREACH或ENETUNREACH错误返回给进行。 bind函数 调用函数socket创建套接字描述符时,该套接字描述符是存储在它的协议族空间中,没有具体的地址,