《6socket编程(ppt).pdf》由会员分享,可在线阅读,更多相关《6socket编程(ppt).pdf(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、SocketSocketSocketSocket网络编程网络编程网络编程网络编程主讲人主讲人主讲人主讲人:李奎李奎李奎李奎socketsocketsocketsocket网络编程基础网络编程基础网络编程基础网络编程基础 socketsocketsocketsocket概述概述概述概述linuxlinuxlinuxlinux中的网络编程通过中的网络编程通过中的网络编程通过中的网络编程通过socketsocketsocketsocket接口实现接口实现接口实现接口实现。SocketSocketSocketSocket既是一种特殊的既是一种特殊的既是一种特殊的既是一种特殊的IOIOIOIO,它也是一
2、种文件描述符它也是一种文件描述符它也是一种文件描述符它也是一种文件描述符。一个完整一个完整一个完整一个完整的的的的Socket Socket Socket Socket 都有一个相关描述都有一个相关描述都有一个相关描述都有一个相关描述 协议协议协议协议,本地地址本地地址本地地址本地地址,本地端本地端本地端本地端口口口口,远程地址远程地址远程地址远程地址,远程端口远程端口远程端口远程端口 ;每一个每一个每一个每一个Socket Socket Socket Socket 有一个本地有一个本地有一个本地有一个本地的唯一的唯一的唯一的唯一Socket Socket Socket Socket 号号号号
3、,由操作系统分配由操作系统分配由操作系统分配由操作系统分配。套接字有三种类型套接字有三种类型套接字有三种类型套接字有三种类型:流式套接字流式套接字流式套接字流式套接字(SOCK_STREAMSOCK_STREAMSOCK_STREAMSOCK_STREAM)流式的套接字可以提供可靠的流式的套接字可以提供可靠的流式的套接字可以提供可靠的流式的套接字可以提供可靠的、面向连接的通讯流面向连接的通讯流面向连接的通讯流面向连接的通讯流。它它它它使用使用使用使用了了了了TCPTCPTCPTCP协议协议协议协议。TCP TCP TCP TCP 保证了数据传输的正确性和顺保证了数据传输的正确性和顺保证了数据传
4、输的正确性和顺保证了数据传输的正确性和顺序性序性序性序性。数据报套接字数据报套接字数据报套接字数据报套接字(SOCK_DGRAMSOCK_DGRAMSOCK_DGRAMSOCK_DGRAM)数据报套接字定义了一种无连接的服务数据报套接字定义了一种无连接的服务数据报套接字定义了一种无连接的服务数据报套接字定义了一种无连接的服务,数据通过相数据通过相数据通过相数据通过相互独立的报文进行传输互独立的报文进行传输互独立的报文进行传输互独立的报文进行传输,是无序的是无序的是无序的是无序的,并且不保证可靠并且不保证可靠并且不保证可靠并且不保证可靠,无差错无差错无差错无差错。使用数据报协议使用数据报协议使用
5、数据报协议使用数据报协议UDPUDPUDPUDP协议协议协议协议。原始套接字原始套接字原始套接字原始套接字原始套接字允许对低层协议如原始套接字允许对低层协议如原始套接字允许对低层协议如原始套接字允许对低层协议如IPIPIPIP或或或或ICMPICMPICMPICMP直接访问直接访问直接访问直接访问,主主主主要用于新的网络协议实现的测试等要用于新的网络协议实现的测试等要用于新的网络协议实现的测试等要用于新的网络协议实现的测试等。基于数据流的基于数据流的基于数据流的基于数据流的socketsocketsocketsocket编程流程编程流程编程流程编程流程数据报的编程流程数据报的编程流程数据报的编
6、程流程数据报的编程流程套接字套接字套接字套接字地址结构地址结构地址结构地址结构structstructstructstruct sockaddrsockaddrsockaddrsockaddr unsigned short unsigned short unsigned short unsigned short sa_familysa_familysa_familysa_family;/*address/*address/*address/*address族族族族,AF_xxxAF_xxxAF_xxxAF_xxx*/*/*/*/char sa_data14;char sa_data14;cha
7、r sa_data14;char sa_data14;/*14 bytes/*14 bytes/*14 bytes/*14 bytes的协议地址的协议地址的协议地址的协议地址*/;sa_familysa_familysa_familysa_family 一般来说一般来说一般来说一般来说,IPV4IPV4IPV4IPV4使用使用使用使用“AF_INETAF_INETAF_INETAF_INET”。sa_datasa_datasa_datasa_data 包含了一些远程电脑的地址包含了一些远程电脑的地址包含了一些远程电脑的地址包含了一些远程电脑的地址、端口和套接字端口和套接字端口和套接字端口和套接
8、字的数目的数目的数目的数目,它里面的数据是杂溶在一起的它里面的数据是杂溶在一起的它里面的数据是杂溶在一起的它里面的数据是杂溶在一起的。结构体数组结构体数组结构体数组结构体数组structstructstructstruct sockaddr_insockaddr_insockaddr_insockaddr_in:为了处理为了处理为了处理为了处理struct sockaddrstruct sockaddrstruct sockaddrstruct sockaddr,程序员建立了另外一个程序员建立了另外一个程序员建立了另外一个程序员建立了另外一个相似的结构体数组相似的结构体数组相似的结构体数组相似
9、的结构体数组struct sockaddr_instruct sockaddr_instruct sockaddr_instruct sockaddr_in:struct sockaddr_in struct sockaddr_in struct sockaddr_in struct sockaddr_in short int sin_family;short int sin_family;short int sin_family;short int sin_family;/*Internet/*Internet/*Internet/*Internet地址族地址族地址族地址族*/unsigne
10、d short int sin_port;unsigned short int sin_port;unsigned short int sin_port;unsigned short int sin_port;/*/*/*/*端口号端口号端口号端口号*/struct in_addr sin_addr;struct in_addr sin_addr;struct in_addr sin_addr;struct in_addr sin_addr;/*Internet/*Internet/*Internet/*Internet地址地址地址地址*/unsigned char sin_zero8;uns
11、igned char sin_zero8;unsigned char sin_zero8;unsigned char sin_zero8;/*/*/*/*添添添添0 0 0 0(和和和和struct struct struct struct sockaddrsockaddrsockaddrsockaddr一样大小一样大小一样大小一样大小)*/;1.1.1.1.structstructstructstruct in_addrin_addrin_addrin_addr 2.2.2.2.unsigned long unsigned long unsigned long unsigned long s
12、_addrs_addrs_addrs_addr;3.3.3.3.;声明一个声明一个声明一个声明一个“baozongbaozongbaozongbaozong”作为一个作为一个作为一个作为一个structstructstructstructsockaddr_insockaddr_insockaddr_insockaddr_in 的结构的结构的结构的结构,那么那么那么那么“baozong.sin_addr.s_addrbaozong.sin_addr.s_addrbaozong.sin_addr.s_addrbaozong.sin_addr.s_addr”就是就是就是就是4 4 4 4 个字节的个
13、字节的个字节的个字节的IP IP IP IP 地地地地址址址址socketsocketsocketsocket系统调用系统调用系统调用系统调用socket socket socket socket 系统调用系统调用系统调用系统调用1.1.1.1.用法用法用法用法retcoderetcoderetcoderetcode=socket(family,type,protocol);=socket(family,type,protocol);=socket(family,type,protocol);=socket(family,type,protocol);2.2.2.2.说明说明说明说明socke
14、tsocketsocketsocket 函数创建一个用于网络通信的套接字函数创建一个用于网络通信的套接字函数创建一个用于网络通信的套接字函数创建一个用于网络通信的套接字,并返回该套接并返回该套接并返回该套接并返回该套接字的整数描述符字的整数描述符字的整数描述符字的整数描述符。3.3.3.3.参数参数参数参数family family family family 类型为类型为类型为类型为intintintint,含义是协议或地址族含义是协议或地址族含义是协议或地址族含义是协议或地址族(对于对于对于对于TCP/IP TCP/IP TCP/IP TCP/IP 为为为为PF_INET PF_INET
15、PF_INET PF_INET,也可使用也可使用也可使用也可使用AF_INET)AF_INET)AF_INET)AF_INET)type type type type 类型为类型为类型为类型为intintintint,含义是服务的类型含义是服务的类型含义是服务的类型含义是服务的类型(对于对于对于对于TCP TCP TCP TCP 为为为为SOCK_STREAMSOCK_STREAMSOCK_STREAMSOCK_STREAM,对于对于对于对于UDPUDPUDPUDP为为为为SOCK_DGRAMSOCK_DGRAMSOCK_DGRAMSOCK_DGRAM)protocol protocol pr
16、otocol protocol 类型为类型为类型为类型为intintintint,含义是使用的协议号含义是使用的协议号含义是使用的协议号含义是使用的协议号,或是用或是用或是用或是用0 0 0 0 指定指定指定指定family family family family 和和和和type type type type 的默认协议号的默认协议号的默认协议号的默认协议号4.4.4.4.返回值返回值返回值返回值成功返回套接字描述符成功返回套接字描述符成功返回套接字描述符成功返回套接字描述符,错误返回错误返回错误返回错误返回-1 1 1 11.1.1.1.用法用法用法用法retcoderetcoderet
17、coderetcode=bind(socket,=bind(socket,=bind(socket,=bind(socket,localaddrlocaladdrlocaladdrlocaladdr,addrlenaddrlenaddrlenaddrlen););););2.2.2.2.说明说明说明说明bindbindbindbind 为一个套接字指明一个本地为一个套接字指明一个本地为一个套接字指明一个本地为一个套接字指明一个本地IP IP IP IP 和协议端口号和协议端口号和协议端口号和协议端口号。bind bind bind bind 主要由服务器使用主要由服务器使用主要由服务器使用主要
18、由服务器使用,它需要指定一个知名协议口它需要指定一个知名协议口它需要指定一个知名协议口它需要指定一个知名协议口bind bind bind bind 系统调用系统调用系统调用系统调用3.3.3.3.参数参数参数参数socket socket socket socket 类型为类型为类型为类型为intintintint,含义是由含义是由含义是由含义是由socket socket socket socket 调用创调用创调用创调用创建一个套接字描述符建一个套接字描述符建一个套接字描述符建一个套接字描述符localaddr localaddr localaddr localaddr 类型为类型为类型
19、为类型为&sockaddr&sockaddr&sockaddr&sockaddr,含义是一个地含义是一个地含义是一个地含义是一个地址结构址结构址结构址结构,指定一个指定一个指定一个指定一个IP IP IP IP 地址和协议端口号地址和协议端口号地址和协议端口号地址和协议端口号addrlen addrlen addrlen addrlen 类型为类型为类型为类型为intintintint,含义是地址结构的字节含义是地址结构的字节含义是地址结构的字节含义是地址结构的字节数大小数大小数大小数大小。4.4.4.4.返回码返回码返回码返回码bind bind bind bind 若成功则返回若成功则返回
20、若成功则返回若成功则返回0 0 0 0,返回返回返回返回 1 1 1 1 表示发生了表示发生了表示发生了表示发生了错误错误错误错误。listen listen listen listen 系统调用系统调用系统调用系统调用1.1.1.1.用法用法用法用法retcoderetcoderetcoderetcode=listen(socket,=listen(socket,=listen(socket,=listen(socket,queuelenqueuelenqueuelenqueuelen););););2.2.2.2.说明说明说明说明服务器使用服务器使用服务器使用服务器使用listen lis
21、ten listen listen 是套接字处于被动状态是套接字处于被动状态是套接字处于被动状态是套接字处于被动状态(准备接准备接准备接准备接受联入请求受联入请求受联入请求受联入请求)。)。)。)。在服务器处理某个请求时在服务器处理某个请求时在服务器处理某个请求时在服务器处理某个请求时,协议软件协议软件协议软件协议软件应将后续收到的请求排队应将后续收到的请求排队应将后续收到的请求排队应将后续收到的请求排队,listen listen listen listen 也设置排队的连也设置排队的连也设置排队的连也设置排队的连接请求数目接请求数目接请求数目接请求数目。listen listen list
22、en listen 只用于只用于只用于只用于TCP TCP TCP TCP 套接字套接字套接字套接字。3.3.3.3.参数参数参数参数socket socket socket socket 类型为类型为类型为类型为intintintint,含义是一个由含义是一个由含义是一个由含义是一个由socket socket socket socket 调调调调用创建的套接字描述符用创建的套接字描述符用创建的套接字描述符用创建的套接字描述符queuelen queuelen queuelen queuelen 类型为类型为类型为类型为intintintint,含义是入连接请求的队含义是入连接请求的队含义是
23、入连接请求的队含义是入连接请求的队列大小列大小列大小列大小4.4.4.4.返回值返回值返回值返回值listen listen listen listen 若成功则返回若成功则返回若成功则返回若成功则返回0 0 0 0,若发生错误则返若发生错误则返若发生错误则返若发生错误则返回回回回1 1 1 1 accept accept accept accept 系统调用系统调用系统调用系统调用1.1.1.1.用法用法用法用法retcoderetcoderetcoderetcode=accept(socket,=accept(socket,=accept(socket,=accept(socket,add
24、raddraddraddr,addrlenaddrlenaddrlenaddrlen););););2.2.2.2.说明说明说明说明服务器调用服务器调用服务器调用服务器调用socket socket socket socket 创建一个套接字创建一个套接字创建一个套接字创建一个套接字,用用用用bind bind bind bind 指定一指定一指定一指定一个本地个本地个本地个本地IP IP IP IP 地址和协议端口号地址和协议端口号地址和协议端口号地址和协议端口号,然后用然后用然后用然后用listen listen listen listen 使套接字使套接字使套接字使套接字处于被动状态处于
25、被动状态处于被动状态处于被动状态,并设置连接请求队列的长度并设置连接请求队列的长度并设置连接请求队列的长度并设置连接请求队列的长度。accept accept accept accept 从队列中取走下一个连接请求从队列中取走下一个连接请求从队列中取走下一个连接请求从队列中取走下一个连接请求(或一直在那里等待下一或一直在那里等待下一或一直在那里等待下一或一直在那里等待下一个连接请求的到达个连接请求的到达个连接请求的到达个连接请求的到达),),),),为请求创建一个新套接字为请求创建一个新套接字为请求创建一个新套接字为请求创建一个新套接字,并返并返并返并返回新的套接字描述符回新的套接字描述符回新
26、的套接字描述符回新的套接字描述符。accept accept accept accept 只用于流套接字只用于流套接字只用于流套接字只用于流套接字(如如如如TCP TCP TCP TCP 套接字套接字套接字套接字)。)。)。)。3.3.3.3.参数参数参数参数socket socket socket socket 类型为类型为类型为类型为intintintint,含义是是由含义是是由含义是是由含义是是由socket socket socket socket 函数创建函数创建函数创建函数创建的一个套接字描述符的一个套接字描述符的一个套接字描述符的一个套接字描述符。addr addr addr a
27、ddr 类型为类型为类型为类型为&sockaddr&sockaddr&sockaddr&sockaddr,含义是一个地址结构的指含义是一个地址结构的指含义是一个地址结构的指含义是一个地址结构的指针针针针。accept accept accept accept 在该结构中填入远程机器的在该结构中填入远程机器的在该结构中填入远程机器的在该结构中填入远程机器的IP IP IP IP 号和协议号和协议号和协议号和协议端口号端口号端口号端口号。addrlen addrlen addrlen addrlen 类型为类型为类型为类型为&int&int&int&int 含义是一个整数指针含义是一个整数指针含义
28、是一个整数指针含义是一个整数指针,初始指初始指初始指初始指定为定为定为定为sockaddr sockaddr sockaddr sockaddr 参数的大小参数的大小参数的大小参数的大小,当调用返回十当调用返回十当调用返回十当调用返回十,指定为指定为指定为指定为存储在存储在存储在存储在addr addr addr addr 中的字节数中的字节数中的字节数中的字节数。4.4.4.4.返回码返回码返回码返回码accept accept accept accept 成功时返回一个非负套接字描述符成功时返回一个非负套接字描述符成功时返回一个非负套接字描述符成功时返回一个非负套接字描述符。发生错发生错发
29、生错发生错误的时候返回误的时候返回误的时候返回误的时候返回 1 1 1 1。connect connect connect connect 系统调用系统调用系统调用系统调用(客户端客户端客户端客户端)1.1.1.1.用法用法用法用法retcoderetcoderetcoderetcode=connect(socket,=connect(socket,=connect(socket,=connect(socket,addraddraddraddr,addrlenaddrlenaddrlenaddrlen););););2.2.2.2.说明说明说明说明connectconnectconnectco
30、nnect 允许调用者为先前创建的套接字指明远程端点的允许调用者为先前创建的套接字指明远程端点的允许调用者为先前创建的套接字指明远程端点的允许调用者为先前创建的套接字指明远程端点的地址地址地址地址。如果套接字使用了如果套接字使用了如果套接字使用了如果套接字使用了TCP TCP TCP TCP,connect connect connect connect 就使用三方握手建立一个连接就使用三方握手建立一个连接就使用三方握手建立一个连接就使用三方握手建立一个连接;如果套如果套如果套如果套接字使用接字使用接字使用接字使用UDP UDP UDP UDP,connect connect connect
31、connect 仅指明远程端点仅指明远程端点仅指明远程端点仅指明远程端点,但不向它传但不向它传但不向它传但不向它传送任何数据报送任何数据报送任何数据报送任何数据报。3.3.3.3.参数参数参数参数socket socket socket socket 类型为类型为类型为类型为intintintint,含义是一个套接字的描述符含义是一个套接字的描述符含义是一个套接字的描述符含义是一个套接字的描述符addr addr addr addr 类型为类型为类型为类型为&sockaddr_in&sockaddr_in&sockaddr_in&sockaddr_in,含义是远程机器端点地含义是远程机器端点地
32、含义是远程机器端点地含义是远程机器端点地址址址址addrlen addrlen addrlen addrlen 类型为类型为类型为类型为intintintint,含义是第二个参数的长度含义是第二个参数的长度含义是第二个参数的长度含义是第二个参数的长度4.4.4.4.返回值返回值返回值返回值connect connect connect connect 若成功就返回若成功就返回若成功就返回若成功就返回0 0 0 0,返回返回返回返回 1 1 1 1 代表发生了错代表发生了错代表发生了错代表发生了错误误误误。补充补充补充补充:setsockoptsetsockoptsetsockoptsetsoc
33、kopt intintintint setsockopt(intsetsockopt(intsetsockopt(intsetsockopt(int s,s,s,s,intintintint level,level,level,level,intintintint optnameoptnameoptnameoptname,const void*const void*const void*const void*optvaloptvaloptvaloptval,socklen_tsocklen_tsocklen_tsocklen_t optlenoptlenoptlenoptlen););););
34、s s s s:标识一个套接口的描述字标识一个套接口的描述字标识一个套接口的描述字标识一个套接口的描述字。levellevellevellevel:选项定义的层次选项定义的层次选项定义的层次选项定义的层次;SOL_SOCKET(SOL_SOCKET(SOL_SOCKET(SOL_SOCKET(基本套接口基本套接口基本套接口基本套接口)和和和和IPPROTO_TCP(TCPIPPROTO_TCP(TCPIPPROTO_TCP(TCPIPPROTO_TCP(TCP套接口套接口套接口套接口)。optnameoptnameoptnameoptname:需设置的选项需设置的选项需设置的选项需设置的选项。
35、optvaloptvaloptvaloptval:指针指针指针指针,指向存放选项值的缓冲区指向存放选项值的缓冲区指向存放选项值的缓冲区指向存放选项值的缓冲区。optlenoptlenoptlenoptlen:optvaloptvaloptvaloptval缓冲区的长度缓冲区的长度缓冲区的长度缓冲区的长度。成功返回成功返回成功返回成功返回0;0;0;0;常见选项常见选项常见选项常见选项 SO_BROADCAST BOOL SO_BROADCAST BOOL SO_BROADCAST BOOL SO_BROADCAST BOOL 允许套接口传送广播信息允许套接口传送广播信息允许套接口传送广播信息允
36、许套接口传送广播信息。SO_DEBUG BOOL SO_DEBUG BOOL SO_DEBUG BOOL SO_DEBUG BOOL 记录调试信息记录调试信息记录调试信息记录调试信息。SO_DONTLINER BOOL SO_DONTLINER BOOL SO_DONTLINER BOOL SO_DONTLINER BOOL 不要因为数据未发送就阻塞关闭操作不要因为数据未发送就阻塞关闭操作不要因为数据未发送就阻塞关闭操作不要因为数据未发送就阻塞关闭操作。设设设设置本选项相当于将置本选项相当于将置本选项相当于将置本选项相当于将SO_LINGERSO_LINGERSO_LINGERSO_LINGE
37、R的的的的l_onoffl_onoffl_onoffl_onoff元素置为零元素置为零元素置为零元素置为零。SO_DONTROUTE BOOL SO_DONTROUTE BOOL SO_DONTROUTE BOOL SO_DONTROUTE BOOL 禁止选径禁止选径禁止选径禁止选径;直接传送直接传送直接传送直接传送。SO_KEEPALIVE BOOL SO_KEEPALIVE BOOL SO_KEEPALIVE BOOL SO_KEEPALIVE BOOL 发送发送发送发送“保持活动保持活动保持活动保持活动”包包包包。SO_LINGER SO_LINGER SO_LINGER SO_LING
38、ER structstructstructstruct linger FAR*linger FAR*linger FAR*linger FAR*如关闭时有未发送数据如关闭时有未发送数据如关闭时有未发送数据如关闭时有未发送数据,则则则则逗留逗留逗留逗留。SO_OOBINLINE BOOL SO_OOBINLINE BOOL SO_OOBINLINE BOOL SO_OOBINLINE BOOL 在常规数据流中接收带外数据在常规数据流中接收带外数据在常规数据流中接收带外数据在常规数据流中接收带外数据。SO_RCVBUF SO_RCVBUF SO_RCVBUF SO_RCVBUF intintint
39、int 为接收确定缓冲区大小为接收确定缓冲区大小为接收确定缓冲区大小为接收确定缓冲区大小。SO_REUSEADDR SO_REUSEADDR SO_REUSEADDR SO_REUSEADDR 允许套接口和一个已在使用中的地址捆绑允许套接口和一个已在使用中的地址捆绑允许套接口和一个已在使用中的地址捆绑允许套接口和一个已在使用中的地址捆绑。SO_SNDBUF SO_SNDBUF SO_SNDBUF SO_SNDBUF intintintint 指定发送缓冲区大小指定发送缓冲区大小指定发送缓冲区大小指定发送缓冲区大小。TCP_NODELAY BOOL TCP_NODELAY BOOL TCP_NODELAY BOOL TCP_NODELAY BOOL 禁止发送合并的禁止发送合并的禁止发送合并的禁止发送合并的NagleNagleNagleNagle算法算法算法算法。SocketSocketSocketSocket基础编程练习基础编程练习基础编程练习基础编程练习:server.cserver.cserver.cserver.c,client.cclient.cclient.cclient.c