Socket网络编程指导.ppt
《Socket网络编程指导.ppt》由会员分享,可在线阅读,更多相关《Socket网络编程指导.ppt(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Socket网络编程指导网络编程指导2023/1/131/什么是什么是Socket?2023/1/132/37BSD Socket(伯克立套接字)是通过标准的(伯克立套接字)是通过标准的UNIX文文件描述符和其它程序通讯的一个方法,目前已经被广泛件描述符和其它程序通讯的一个方法,目前已经被广泛移植到各个平台。移植到各个平台。Socket是独立于具体协议的网络编程接口。在是独立于具体协议的网络编程接口。在ISO模型模型中,主要位于会话层和传输层。中,主要位于会话层和传输层。Socket的类型的类型2023/1/133/37l流式套接字流式套接字(SOCK_STREAM)提供了一个面向连接,可靠的
2、数据传输服务,数据无差提供了一个面向连接,可靠的数据传输服务,数据无差错,无重复的发送且按发送顺序接收。内设流量控制,避错,无重复的发送且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。免数据流超限;数据被看作是字节流,无长度限制。l数据报式套接字数据报式套接字(SOCK_DGRAM)提供了一个无连接服务。数据包以独立包形式被发送,提供了一个无连接服务。数据包以独立包形式被发送,不提供无差错保证不提供无差错保证,数据可能丢失或重复,并且接收顺序无数据可能丢失或重复,并且接收顺序无序。序。l原始式套接字原始式套接字(SOCK_RAW)该接口允许对较低层次协议,如该接
3、口允许对较低层次协议,如IP、ICMP直接访问。直接访问。2023/1/134/37 Socket所在层次示意图所在层次示意图Application programStreamSocketInterfaceTCPUDPDatagramSocketInterfaceRawSocketInterfaceIPPhysical and data link layers基本套接字调用基本套接字调用2023/1/135/37创建套接字创建套接字socket();绑定本机端口绑定本机端口bind();建立连接建立连接connect();接受连接接受连接accept();监听端口监听端口listen();数据
4、传输数据传输send(),recv()等等;关闭套接字关闭套接字close();Socket相关的数据结构相关的数据结构2023/1/136/37lstruct sockaddr_in short int sin_family;/*通信类型通信类型*/unsigned short int sin_port;/*端口号端口号,网络字节顺序网络字节顺序*/struct in_addr sin_addr;/*Internet 地址地址,网络字节顺序网络字节顺序*/unsigned char sin_zero8;/*没用没用*/;lstruct in_addr in_addr_t s_addr;/*存
5、储存储32bit 的的IP地址地址*/网络字节顺序和主机字节顺序网络字节顺序和主机字节顺序2023/1/137/37lBig-Endian Byte Order:字节的高位在内存中放在存储字节的高位在内存中放在存储单元的起始位置单元的起始位置0000101000010111000011100000011000001010000101110000111000000110Memoryl Little-Endian Byte Order:与与Big-Endian相反相反AA+1A+2A+32023/1/138/40Host byte order(Little-Endian)16-bit32-bitN
6、etwork byte order(Big-Endian)16-bit32-bithtons()ntohs()htonl()ntohl()网络字节顺序和主机字节顺序的转换网络字节顺序和主机字节顺序的转换IP地址的转换地址的转换2023/1/139/37int inet_aton(const char*strptr,struct in_addr *addrptr);从点状十进制到从点状十进制到32位位2进制的转换,如进制的转换,如“202.38.64.185”到到 11001010,00100110,01000000,10111001char *inet_ntoa(struct in_addr
7、inadd);与与inet_aton()的功能相反的功能相反相关的内存操作函数相关的内存操作函数2023/1/1310/37void*memset(void*buffer,int c,int count);把把buffer所指内存区域的前所指内存区域的前count个字节设置成字符个字节设置成字符c。void*memcpy(void*dest,void*src,unsigned int count);由由src所指内存区域复制所指内存区域复制count个字节到个字节到dest所指内存区所指内存区域。域。Void bzero(void*s,int n);置字节字符串置字节字符串s的前的前n个字节为
8、零。个字节为零。域名和域名和IP地址的转换地址的转换2023/1/1311/37struct hostent*gethostbyname(const char*name);struct hostent char*h_name;/*主机的官方域名主机的官方域名*/char *h_aliases;/*一个以一个以NULL结尾的主机别名数组结尾的主机别名数组*/int h_addrtype;/*返回的地址类型,在返回的地址类型,在Internet环境下为环境下为AF-INET*/int h_length;/*地址的字节长度地址的字节长度*/char *h_addr_list;/*一个以一个以0结尾的
9、数组,包含该主机的所有地结尾的数组,包含该主机的所有地址址*/;#define h_addr h_addr_list0 /*在在h-addr-list中的第一个地址中的第一个地址*/建立建立Socket2023/1/1312/37l int socket(int domain,int type,int protocol);l参数说明:参数说明:domain:通信使用的协议族,即网络的类型,对于:通信使用的协议族,即网络的类型,对于 TCP/IP来说,是来说,是AF_INET type:SOCK_STREAM/SOCK_DGRAM protocol:通常为通常为0 返回整形的返回整形的socke
10、t描述符,如果出错,返回描述符,如果出错,返回-1 Socket的配置的配置2023/1/1313/37lSocket描述符是一个指向内部数据结构的指针,它指向描描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用述符表入口。调用Socket()函数时,将建立一个函数时,将建立一个Socket,为一个为一个Socket数据结构分配存储空间。数据结构分配存储空间。l两个网络程序之间的一个网络连接包括五种信息:通信协两个网络程序之间的一个网络连接包括五种信息:通信协议、本地主机地址和端口、远端主机地址和端口。议、本地主机地址和端口、远端主机地址和端口。l在使用在使用socket进行网络传输
11、以前,必须配置该进行网络传输以前,必须配置该socket。面向连接的面向连接的socket客户端调用客户端调用connect()函数在函数在socket数据结构中保存本地和远端信息。数据结构中保存本地和远端信息。无连接无连接socket的客户端和服务端以及面向连接的客户端和服务端以及面向连接socket的服务端通过调用的服务端通过调用bind()函数来配置本地信息。函数来配置本地信息。绑定绑定Socket2023/1/1314/37lint bind(int sockfd,struct sockaddr_in*my_addr,int addrlen);sockfd是是socket()返回的返回
12、的socket描述符;描述符;my_addr是指向包含本机是指向包含本机IP地址及端口号等信息的地址及端口号等信息的 sockaddr类型的指针;类型的指针;addrlen一般被设置为一般被设置为sizeof(struct sockaddr_in)成功被调用时返回成功被调用时返回0;出现错误时返回;出现错误时返回-1 绑定前绑定前sockaddr_in的初始化的初始化2023/1/1315/37my_addr.sin_family=AF_INET;/选择网络类型为选择网络类型为TCP/IPmy_addr.sin_addr.s_addr=inet_addr(“210.45.64.222);my_
13、addr.sin_port=htons(8888);/选择端口选择端口8888addr_len=sizeof(struct sockaddr_in);memset(&my_addr.sin_zero,0,sizeof(my_addr.sin_zero);建立连接(客户端)建立连接(客户端)2023/1/1316/37面向连接的客户程序使用面向连接的客户程序使用connect函数来配置函数来配置socket并与并与远端服务器建立一个远端服务器建立一个TCP连接,其函数原型为:连接,其函数原型为:int connect(int sockfd,struct sockaddr_in *serv_add
14、r,int addrlen);serv_addr是包含远端主机是包含远端主机IP地址和端口号的指针;地址和端口号的指针;addrlen是远端地址结构的长度是远端地址结构的长度 成功则返回成功则返回0,出现错误时返回,出现错误时返回-1 建立连接(服务器端)建立连接(服务器端)2023/1/1317/37服务器监听端口:服务器监听端口:listen函数使函数使socket处于被动的监听模式,处于被动的监听模式,并为该并为该socket建立一个输入数据队列,将到达的服务请求建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。保存在此队列中,直到程序处理它们。int listen
15、(int sockfd,int backlog);backlog:请求连接队列的最大长度请求连接队列的最大长度成功返回成功返回0,出错返回,出错返回-1 建立连接(服务器端)建立连接(服务器端)2023/1/1318/37accept()函数让服务器接收客户的连接请求。在建立好输函数让服务器接收客户的连接请求。在建立好输入队列后,服务器就调用入队列后,服务器就调用accept函数,然后睡眠并等待客函数,然后睡眠并等待客户的连接请求。户的连接请求。int accept(int sockfd,sockaddr_in*addr,int *addrlen);addr是指向是指向sockaddr_in变
16、量的指针,该变量存放提出连变量的指针,该变量存放提出连接请求服务的主机的信息接请求服务的主机的信息 返回新的返回新的socket描述符,和请求连接进程的地址联系起来描述符,和请求连接进程的地址联系起来在新的在新的socket描述符上进行数据传输操作。原来的描述符上进行数据传输操作。原来的socket继续继续listen 数据传输数据传输(1)2023/1/1319/37send()和和recv()这两个函数用于面向连接的这两个函数用于面向连接的socket上进行上进行数据传输。数据传输。send()函数原型为:函数原型为:int send(int sockfd,const void*msg,i
17、nt len,int flags);sockfd是用来传输数据的是用来传输数据的socket描述符;描述符;msg是指向要是指向要发送数据的指针;发送数据的指针;len是以字节为单位的数据长度;是以字节为单位的数据长度;flags一一般置为般置为0 send()返回实际发送的字节数,可能会少于希望发送的数返回实际发送的字节数,可能会少于希望发送的数据。在程序中应该将据。在程序中应该将send()的返回值与欲发送的字节数进的返回值与欲发送的字节数进行比较。当返回值与行比较。当返回值与len不匹配时,应该进行处理。不匹配时,应该进行处理。数据传输数据传输(2)2023/1/1320/37recv(
18、)函数原型为:函数原型为:int recv(int sockfd,void*buf,int len,unsigned int flags);buf 是存放接收数据的缓冲区;是存放接收数据的缓冲区;len是缓冲区的长度。是缓冲区的长度。flags也被置为也被置为0。recv()返回实际接收的字节数,当出现错误时,返回返回实际接收的字节数,当出现错误时,返回-1数据传输数据传输(3)2023/1/1321/37 sendto()和和recvfrom()用于在无连接的数据报用于在无连接的数据报socket方方 式下进行数据传输。由于本地式下进行数据传输。由于本地socket没有与远端机器建立连没有与
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Socket 网络 编程 指导
限制150内