




已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
现代网络技术,第10章网络编程基础,10.1socket编程10.2利用MySQLC接口实现多用户通信,10.1socket编程,10.1.1基本概念1端口与插口端口用16bit的地址码端口号进行标识。一个插口(socket),也称一个套接口,一个二元组(IP地址,端口号)。一条连接需要用一对插口标识。这对插口组成一个四元组:(本地IP地址,本地端口号,远程IP地址,远程端口号),现代网络技术,10.1socket编程,2插口API为了简化网络应用程序的设计,为了使进程对通信信道的操作能够像对文件一样简单,伯克利的开发者们开发了一种称为插口(socket)的逻辑文件。当系统把一个socket分配给一个进程时,就是将一个进程连接到了一个信道的端点上,就好像一个用户把一台电话机接到了电话线上,只要对方也把电话机接到电话线上,双方就可以进行连接、通话了。,现代网络技术,10.1socket编程,Socket为整个网络通信提供协议基础。进程间的通信就通过连接两个进程的通路进行,软件设计人员不必考虑这个通路是什么,只要知道如何把一个进程连接到通路的端点即可;通路端点的分配由逻辑文件Socket进行,使得进程用文件描述符访问通路就像访问普通文件一样,大大简化了通信程序的设计。,现代网络技术,10.1socket编程,10.1.2socket概述socket接口是TCP/IP网络的API,socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。常用的socket类型有两种:流式socket(SOCK_STREAM)流式是一种面向连接的socket,针对于面向连接的TCP服务应用;数据报式socket(SOCK_DGRAM)是一种无连接的socket,对应于无连接的UDP服务应用。,现代网络技术,10.1socket编程,10.1.3socket中的主要调用1建立socket为了建立socket,程序可以调用socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:intsocket(intdomain,inttype,intprotocol);,现代网络技术,10.1socket编程,实际上“建立一个socket”意味着为一个socket数据结构分配存储空间。socket执行体为你管理描述符表。两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。socket数据结构中包含这五种信息。,现代网络技术,10.1socket编程,2socket配置面向连接的socket客户端通过调用connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端以及面向连接socket的服务端通过调用bind函数来配置本地信息。bind函数原型为:intbind(intsockfd,structsockaddr*my_addr,intaddrlen);,现代网络技术,10.1socket编程,structsockaddr结构类型是用来保存socket信息的:structsockaddrunsignedshortsa_family;/*地址族,AF_xxx*/charsa_data14;/*14字节的协议地址*/;,现代网络技术,10.1socket编程,另外还有一种结构类型:structsockaddr_inshortintsin_family;/*地址族*/unsignedshortintsin_port;/*端口号*/structin_addrsin_addr;/*IP地址*/unsignedcharsin_zero8;/*填充0以保持与structsockaddr同样大小*/;,现代网络技术,10.1socket编程,使用bind函数时,可以用下面的赋值实现自动获得本机IP地址和随机获取一个没有被占用的端口号:my_addr.sin_port=0;/*系统随机选择一个未被使用的端口号*/my_addr.sin_addr.s_addr=INADDR_ANY;/*填入本机IP地址*/,现代网络技术,10.1socket编程,计算机数据存储有两种字节优先顺序:高位字节优先低位字节优先。Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换,否则就会出现数据不一致。,现代网络技术,10.1socket编程,下面是几个字节顺序转换函数:(1)htonl():把32位值从主机字节序转换成网络字节序(2)htons():把16位值从主机字节序转换成网络字节序(3)ntohl():把32位值从网络字节序转换成主机字节序(4)ntohs():把16位值从网络字节序转换成主机字节序,现代网络技术,10.1socket编程,3连接建立面向连接的客户程序使用connect函数来配置socket并与远端服务器建立一个TCP连接其函数原型为:intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);,现代网络技术,10.1socket编程,listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。intlisten(intsockfd,intbacklog);,现代网络技术,10.1socket编程,accept()函数让服务器接收客户的连接请求。在建立好输入队列后,服务器就调用accept函数,然后睡眠并等待客户的连接请求。intaccept(intsockfd,void*addr,int*addrlen);,现代网络技术,10.1socket编程,4数据传输send()和recv()这两个函数用于面向连接的socket上进行数据传输。send()函数原型为:intsend(intsockfd,constvoid*msg,intlen,intflags);,现代网络技术,10.1socket编程,在程序中应该将send()的返回值与欲发送的字节数进行比较。当send()返回值与len不匹配时,应该对这种情况进行处理。char*msg=Hello!;intlen,bytes_sent;len=strlen(msg);bytes_sent=send(sockfd,msg,len,0);,现代网络技术,10.1socket编程,recv()函数原型为:intrecv(intsockfd,void*buf,intlen,unsignedintflags);sendto()和recvfrom()用于在无连接的数据报socket方式下进行数据传输。由于本地socket并没有与远端机器建立连接,所以在发送数据时应指明目的地址。,现代网络技术,10.1socket编程,sendto()函数原型为:intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,conststructsockaddr*to,inttolen);recvfrom()函数原型为:intrecvfrom(intsockfd,void*buf,intlen,unsignedintflags,structsockaddr*from,int*fromlen);,现代网络技术,10.1socket编程,5结束传输当所有的数据操作结束以后,你可以调用close()函数来释放该socket,从而停止在该socket上的任何数据操作:close(sockfd);可以调用shutdown()函数来关闭该socket。intshutdown(intsockfd,inthow);,现代网络技术,10.1socket编程,10.1.4socket实例代码实例中的服务器通过socket连接向客户端发送字符串“Hello,youareconnected!”。只要在服务器上运行该服务器软件,在客户端运行客户软件,客户端就会收到该字符串。,现代网络技术,10.1socket编程,1服务器软件代码#include#include#include#include#include#include#include#include#defineSERVPORT3333/*服务器监听端口号*/#defineBACKLOG9/*最大同时连接请求数*/,main()intsockfd,client_fd;/*sock_fd:监听socket;client_fd:数据传输socket*/structsockaddr_inmy_addr;/*本机地址信息*/structsockaddr_inremote_addr;/*客户端地址信息*/if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)perror(socket创建出错!);exit(1);,现代网络技术,10.1socket编程,my_addr.sin_family=AF_INET;my_addr.sin_port=htons(SERVPORT);my_addr.sin_addr.s_addr=INADDR_ANY;bzero(,if(listen(sockfd,BACKLOG)=-1)perror(listen出错!);exit(1);,现代网络技术,10.1socket编程,while(1)sin_size=sizeof(structsockaddr_in);if(client_fd=accept(sockfd,(structsockaddr*),printf(receivedaconnectionfrom%sn,inet_ntoa(remote_addr.sin_addr);if(!fork()/*子进程代码段*/if(send(client_fd,Hello,youareconnected!n,26,0)=-1)perror(send出错!);close(client_fd);exit(0);,现代网络技术,10.1socket编程,close(client_fd);,2客户端程序代码#include#include#include#include#include#include#include#include#defineSERVPORT3333#defineMAXDATASIZE90/*每次最大数据传输量*/,现代网络技术,10.1socket编程,main(intargc,char*argv)intsockfd,recvbytes;charbufMAXDATASIZE;structhostent*host;structsockaddr_inserv_addr;if(argch_addr);bzero(,if(recvbytes=recv(sockfd,buf,MAXDATASIZE,0)=-1)perror(recv出错!);exit(1);bufrecvbytes=0;printf(Received:%s,buf);close(sockfd);,现代网络技术,10.1socket编程,函数gethostbyname()是完成域名转换的。函数原型为:structhostent*gethostbyname(constchar*name);函数返回为hosten的结构类型,它的定义如下:structhostentchar*h_name;/*主机的官方域名*/char*h_aliases;/*一个以NULL结尾的主机别名数组*/,现代网络技术,10.1socket编程,inth_addrtype;/*返回的地址类型,在Internet环境下为AF-INET*/inth_length;/*地址的字节长度*/char*h_addr_list;/*一个以0结尾的数组,包含该主机的所有地址*/;#defineh_addrh_addr_list0/*在h-addr-list中的第一个地址*/,现代网络技术,10.1socket编程,10.1.5阻塞和非阻塞阻塞函数在完成其指定的任务以前不允许程序调用另一个函数。非阻塞操作则可以立即完成。Select函数原型为:intselect(intnumfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);,现代网络技术,10.1socket编程,为了实现fd_set中对应的文件描述符的设置、复位和测试,它提供了一组宏:FD_ZERO(fd_set*set)-清除一个文件描述符集;FD_SET(intfd,fd_set*set)-将一个文件描述符加入文件描述符集中;FD_CLR(intfd,fd_set*set)-将一个文件描述符从文件描述符集中清除;FD_ISSET(intfd,fd_set*set)-试判断是否文件描述符被置位。,现代网络技术,10.1socket编程,timeout参数是一个指向structtimeval类型的指针,它可以使select()在等待timeout长时间后没有文件描述符准备好即返回。structtimeval数据结构为:structtimevalinttv_sec;/*seconds*/inttv_usec;/*microseconds*/;,现代网络技术,10.1socket编程,POP3客户端实例:代码实例基于POP3的客户协议,与邮件服务器连接并取回指定用户帐号的邮件。与邮件服务器交互的命令存储在字符串数组POPMessage中,程序通过一个do-while循环依次发送这些命令。,现代网络技术,10.2利用MySQLC接口实现多用户通信,10.2利用MySQLC接口实现多用户通信1技术概述(1)基于TCP/IP的通信技术基于TCP/IP的通信基本上都是利用socket套接字进行数据通信,程序一般分为服务器端和客户端两部分。设计思路如下:第一部分服务器端1)创建服务器套接字。,现代网络技术,10.2利用MySQLC接口实现多用户通信,2)服务器套接字进行信息绑定,并开始监听连接。3)接受来自客户端的连接请求。4)创建子进程,子进程继续监听和接受客户端的连接请求。5)主进程与已连接用户间进行数据传输。6)主进程关闭套接字,数据传输结束。,现代网络技术,10.2利用MySQLC接口实现多用户通信,第二部分客户端1)创建客户端套接字。2)与服务器进行连接,如被接受则创建接收进程3)开始数据传输。4)关闭套接字,客户端程序结束。,现代网络技术,10.2利用MySQLC接口实现多用户通信,(2)进程进程是一个具有独立功能的程序关于某个数据集合的一次可以并发执行的运行活动,进程作为构成系统的基本细胞,不仅是系统内部独立运行的实体,也是独立竞争资源的基本实体。,现代网络技术,10.2利用MySQLC接口实现多用户通信,(3)MySQLC接口MySQL提供了一套CAPI函数,它由一组函数以及一组用于函数的数据类型组成,这些函数与MySQL服务器进行通信并访问数据库。MySQLCAPI数据类型包括:MYSQL(数据库连接句柄)、MYSQL_RES(查询返回结果集)、MYSQL_ROW(行集)等;,现代网络技术,10.2利用MySQLC接口实现多用户通信,CAPI提供的函数包括:1)mysql_connect()函数MYSQL*mysql_connect(MYSQL*mysql,constchar*host,constchar*user,constchar*passwd)2)mysql_select_db()函数intmysql_select_db(MYSQL*mysql,constchar*db),现代网络技术,10.2利用MySQLC接口实现多用户通信,3)mysql_close()函数voidmysql_close(MYSQL*mysql)4)mysql_query()函数intmysql_query(MYSQL*mysql,constchar*query)5)mysql_store_result()函数MYSQL_RES*mysql_store_result(MYSQL*mysql)6)my
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物化学药物制剂技术知识考点
- 医疗器械设计和开发控制程序
- 《窦娥冤》公开课获奖
- 前小双控总结
- 北京电大新版教务管理系统CPS1.0版免修免考工作手册
- 七营中学创建海原县级“文明单位”活动安排
- 高一人教版英语《MusicDiscovering Useful Structures》
- 顾客忠诚度提升新零售客户关系管理的关键
- 项目管理技能在新能源汽车行业的提升策略与实践案例分享
- 音乐产业中的数据分析与市场趋势预测
- 电力监理档案管理课件
- 2型糖尿病分级诊疗
- 2024-2025学年七年级语文上学期期中模拟卷(含答案)
- 2025年青海省中考数学模拟试卷附答案解析
- 企业合规管理手册
- 会诊制度培训课件
- 人教版数学三年级下册期末考试试卷及答案
- 年产15万张建筑模板及疫木处理建设项目可行性研究报告模板-立项备案
- 2024年涉密人员考试试题库保密基本知识试题附答案(考试直接用)
- 初中英语中考常考一词多义词总结
- 2025年日历A4纸打印
评论
0/150
提交评论