多线程网络编程课件.ppt
《多线程网络编程课件.ppt》由会员分享,可在线阅读,更多相关《多线程网络编程课件.ppt(51页珍藏版)》请在三一办公上搜索。
1、多线程网络编程,R&D IP 夏建嵬2007/08,2022/12/7,AsiaInfo Technologies (China), Ltd.,2,课程目标,理解应用系统日志机制,熟练使用日志接口掌握socket编程基础,能理解socket封装类掌握posix多线程编程基础能轻松快速构建稳定的、可扩展的多线程服务器,2022/12/7,AsiaInfo Technologies (China), Ltd.,3,课程内容,应用系统的日志机制介绍深入Posix编程深入Socket编程构建多线程网络服务器,2022/12/7,AsiaInfo Technologies (China), Ltd.,4
2、,Socket编程,TCP/IP协议概述TCP编程UDP编程,2022/12/7,AsiaInfo Technologies (China), Ltd.,5,TCP/IP协议概述协议分层,2022/12/7,AsiaInfo Technologies (China), Ltd.,6,TCP/IP协议概述主机间的连接,2022/12/7,AsiaInfo Technologies (China), Ltd.,7,TCP/IP协议概述基本概念,字节顺序:机器结构或网络硬件的差异小端(Little-Endian):最低存储地址包含了整数的最低位置。大端(Big-Endian):最低存储地址包含了整数
3、的最高位置。网络标准字节顺序:首先发送整数中的最高有效字节(大端方式) 问题:字符数组需要进行转换吗?IP地址的分类,2022/12/7,AsiaInfo Technologies (China), Ltd.,8,网络掩码 为了更充分地利用宝贵的IP地址资源,子网的概念被引入。为此,IP地址的主机部分又被分为子网部分和主机部分。IP地址 网络地址 子网地址 主机地址 网络掩码(32位):某位为1,代表IP地址中的对应位为网络地址;某位为0,代表IP地址中的对应位为主机地址。 路由器在处理子网的IP数据包时,将数据包的目标地址和各个子网的网络掩码进行“与”操作,然后将结果与子网的地址进行比较。,
4、TCP/IP协议概述基本概念,2022/12/7,AsiaInfo Technologies (China), Ltd.,9,TCP/IP协议概述基本概念,不同体系结构的编程模型ILP32模型:32位系统上使用,意即Integer-Long-Pointer都是32位。LP64模型:64位系统上使用,意即Long-Pointer都是64位。端口号 TCP/UDP协议使用16位的端口号来区分不同的进程。RFC 1700包含了由IANA定义的端口列表:知名(well-known)端口:01023,由IANA分配和控制。已注册(register)端口:102449151,在IANA注册但不受其控制。动
5、态(dynamic)端口:4915265535,临时端口,可随意使用。,2022/12/7,AsiaInfo Technologies (China), Ltd.,10,TCP/IP协议概述IP协议,IP协议概述 IP(Internet Protocol)协议是网络层协议,主要功能及特点:不可靠的数据报传输服务。路由选择功能。无连接服务。最大努力传送(best-effort delivery)特性。IP报文的格式,2022/12/7,AsiaInfo Technologies (China), Ltd.,11,TCP/IP协议概述套接字地址结构,通用套接字地址结构struct sockaddr
6、 unsigned short sa_family;/地址类型,AF_INETchar sa_data14;/协议地址;TCP/IP协议相关的地址结构/IP地址结构struct in_addr _u32 s_addr;/IP地址,网络字节顺序;/TCP/IP协议的套接字地址struct sockaddr_in short in sa_family;/地址类型,为AF_INETunsigned short int sin_port;/端口号,网络字节顺序struct in_addr sin_addr;/IP地址/填充字节,最好初始化为0;,2022/12/7,AsiaInfo Technolog
7、ies (China), Ltd.,12,TCP/IP协议概述基础socket函数介绍,字节转换相关函数/h: host n: network l: long s: shortuint32_t htonl(uint32_t hostlong);uint16_t htons(uint16_t hostshort);uint32_t ntohl(uint32_t netlong);uint16_t ntohs(uint16_t netshort);地址转换相关函数/a: ascii n: networkint inet_aton(const char *cp, struct in_addr *in
8、p);char *inet_ntoa(struct in_addr in);in_addr_t inet_addr(const char *cp);in_addr_t inet_network(const char *cp);,2022/12/7,AsiaInfo Technologies (China), Ltd.,13,gethostbyname函数/首先查本地hosts文件,然后查DNSstruct hostent *gethostbyname(const char *name);int gethostbyname_r (const char *name, struct hostent
9、*ret, char *buf, size_t buflen, struct hostent *result, int *h_errnop);/hostent结构struct hostent char *h_name;/正式的主机名char *h_aliases;/别名列表int h_addrtype;/地址类型int h_length;/地址长度char *h_addr_list;/IP地址列表 #define h_addr h_addr_list0,TCP/IP协议概述基础socket函数介绍,/gethostbyname_r使用实例struct hostent *result;struc
10、t hostent hentry;char hdata4096;int hlen = sizeof(hdata);int herr = 0;memset(hdata, 0, sizeof(hdata);int ret;ret = gethostbyname_r(m_cnAddr.c_str(), ,2022/12/7,AsiaInfo Technologies (China), Ltd.,14,gethostbyaddr函数struct hostent *gethostbyaddr(const char *addr, int len, int family);struct hostent *g
11、ethostbyaddr_r(const char *addr, int length, int type, struct hostent *result, char *buffer, int buflen, int *h_errnop);注:1、addr参数是指向in_addr类型的指针。 2、Linux没有提供gethostbyaddr_r(),上面的API是Solaris提供的。获得或设置套接字选项int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen);int setsockopt(in
12、t s, int level, int optname, const void *optval, socklen_t optlen); 选项的层次SOL_SOCKET:通用套接字选项。IPPROTO_IP:IP选项。IPPROTO_TCP:TCP选项。,TCP/IP协议概述基础socket函数介绍,2022/12/7,AsiaInfo Technologies (China), Ltd.,15,常用选项说明SO_ERROR选项获得并清除套接字错误。例如:int sock_err = 0; int sock_err_len = sizeof (sock_err); /注意:别忘了int sock
13、opt_ret = getsockopt(socketFD(), SOL_SOCKET, SO_ERROR, (void *),TCP/IP协议概述基础socket函数介绍,2022/12/7,AsiaInfo Technologies (China), Ltd.,16,LINGER结构说明:l_onoff为0禁止close()延迟操作,l_linger成员被忽略。close()按默认方式工作。l_onoff非0,l_linger为0调用close()后夭折该连接,即丢弃发送缓冲区中的未发送数据,并向对端发送RST报文之后关闭连接,这样可以避免TIME_WAIT状态。但会造成数据丢失/数据混乱
14、/连接非正常关闭。l_onoff非0,l_linger非0调用close()后,其返回将会延迟l_linger指定的秒数。SO_RCVBUF和SO_SNDBUF选项SO_RCVBUF选项用于设置套接字接收缓冲区大小,而SO_SNDBUF选项用于设置套接字发送缓冲区大小。加大缓冲区大小可以改善网络处理性能,但缓冲区大小都有个上限限制。注意:对于TCP连接而言,修改缓冲区大小必须在连接建立之前,即connect()或listen()前对于UDP连接而言,没有实际的发送缓冲区,该选项表示能够发送的、最大UDP报文的大小。,TCP/IP协议概述基础socket函数介绍,2022/12/7,AsiaIn
15、fo Technologies (China), Ltd.,17,SO_REUSEADDR选项该选项用于解决重复绑定问题,后面详细介绍。需要注意的是:该选项必须在绑定操作之前设置。例如:/set the SO_REUSEADDR option, sockfd为打开的socket描述符int optval = 1;if(0 != setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval) /错误处理if(0 != bind(sockfd, ) 多路监听函数select()函数select() 可用于同时检测多个描述符是
16、否就绪。当某个描述符就绪时,函数select()成功返回,否则,它将阻塞直到超时(如果设置)。,TCP/IP协议概述基础socket函数介绍,2022/12/7,AsiaInfo Technologies (China), Ltd.,18,int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);该函数能同时检测三个描述符集合:读集合(readfds),写集合(writefds)和异常集合(exceptfds)。读就绪的条件接收缓冲区的数据量不小于套接字的接收
17、下限。连接的读通道被关闭,即收到FIN报文。监听套接字的完成队列不为空,即表示有已经建立的连接。调用函数connect()以非阻塞方式进行连接的过程中出现错误。写就绪的条件发送缓冲区的可用空间不小于套接字的发送下限。连接的写通道被关闭。注:向已经关闭写通道的连接上写数据会产生SIGPIPE信号。非阻塞式套接字的TCP连接建立成功。调用函数connect()以非阻塞方式进行连接过程中出现错误。异常就绪的条件套接字上有带外数据未接收。套接字仍在带外标记的范围内,即带外数据还在正常的字节流中未被读取。,TCP/IP协议概述基础socket函数介绍,2022/12/7,AsiaInfo Technol
18、ogies (China), Ltd.,19,描述符集合相关的宏:FD_CLR(int fd, fd_set *set);/将某个描述符从指定的描述符集中删除FD_ISSET(int fd, fd_set *set);/检查某个描述符是否被设置(就绪)FD_SET(int fd, fd_set *set);/将某个描述符加入到指定的描述符集中FD_ZERO(fd_set *set);/清空整个描述符集 使用函数select(): fd_set wset;FD_ZERO(if(0 != ret) /错误处理/读剩余字节数,TCP/IP协议概述基础socket函数介绍,2022/12/7,Asia
19、Info Technologies (China), Ltd.,20,Socket编程,TCP/IP协议概述TCP编程UDP编程,2022/12/7,AsiaInfo Technologies (China), Ltd.,21,TCP编程协议概述,TCP协议概述 TCP(Transmission Control Protocol)协议,是基于IP协议的传输控制协议,提供可靠的、面向连接的服务。主要特征:可靠性:通过确认和超时重传来保证的。面向无结构的字节流:数据之间没有界限。面向连接:通信之前,必须建立连接;通信结束,必须关闭连接。全双工:通信双方都可以同时发送和接收数据。提供流量控制机制:通
20、过滑动窗口实现。TCP报文的格式,2022/12/7,AsiaInfo Technologies (China), Ltd.,22,TCP编程建立连接,建议TCP连接 TCP协议采用三次握手方式来建立一条可靠的连接。在这个过程中,连接双方完成各自初始序列号的交换。,2022/12/7,AsiaInfo Technologies (China), Ltd.,23,TCP编程关闭连接,关闭TCP连接 由于TCP连接是全双工连接,因此,需要同时关闭读通道和写通道。,2022/12/7,AsiaInfo Technologies (China), Ltd.,24,TCP编程基本函数介绍,函数socke
21、t()int socket(int domain, int type, int protocol);【参数说明】domainin 协议簇,TCP/IP为AF_INET。typein 套接字类型。TCP:SOCK_STREM;UDP:SOCK_DGRAM。protocolin 使用的协议,默认为0。对于TCP/UDP而言,设为0即可。【功能】该函数在内核中创建一个套接字结构,并返回一个标识该结构的描述符。连接相关的所有信息都保存在该套接字结构中。函数bind()int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);【功
22、能】该函数将套接字绑定在到本地地址和端口。,2022/12/7,AsiaInfo Technologies (China), Ltd.,25,TCP编程基本函数介绍,【说明】对于服务端程序而言,bind()函数必须被调用,以绑定自己的公认端口号,而IP地址可以设定为通用地址INADDR_ANY或某个本地IP地址。对于客户端程序而言,一般不需要指定套接字地址(本地IP地址和端口),因为系统会自动为套接字选择一个未用的端口和本地IP地址,因此,没必要调用bind()函数:IP地址可以指定设为某个本地IP地址或INADDR_ANY。端口可以设为非零值或0,其中,0表示由系统指定端口号。建议:一般情况
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多线程 网络 编程 课件

链接地址:https://www.31ppt.com/p-1572810.html