网络编程_第二课_socket编程基础

上传人:ji****n 文档编号:54450421 上传时间:2018-09-13 格式:PPT 页数:18 大小:68.50KB
返回 下载 相关 举报
网络编程_第二课_socket编程基础_第1页
第1页 / 共18页
网络编程_第二课_socket编程基础_第2页
第2页 / 共18页
网络编程_第二课_socket编程基础_第3页
第3页 / 共18页
网络编程_第二课_socket编程基础_第4页
第4页 / 共18页
网络编程_第二课_socket编程基础_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《网络编程_第二课_socket编程基础》由会员分享,可在线阅读,更多相关《网络编程_第二课_socket编程基础(18页珍藏版)》请在金锄头文库上搜索。

1、2: Socket编程基础,1,Lecturer: 张靖宇 四川大学计算机学院 Email:jingyuz ,网络编程,Part2. Socket编程基础,2: Socket编程基础,2,System calls relevant to networking,socket connect bind listen accept send recv close / closesocket shutdown select fcntl getsockname getpeername getsockopt,2: Socket编程基础,3,socket System Call,网络应用进程调用的第一个函数

2、,用于创建套接口int socket(int family, int type, int protocol);返回:非负描述字 成功 ,-1 失败 典型用例int sockfd=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);,2: Socket编程基础,4,bind System Call,bind为套接口分配一个本地协议地址int bind(int sockfd, const struct sockaddr * myaddr,int addrlen); 几乎所有server进程在三路握手前,都需要绑定到一个well-known地址。 client通常不必调

3、用bind。Why?,2: Socket编程基础,5,bind System Call 示例,int sockfd; / Create a socket sockfd = socket(AF_INET, SOCK_STREAM, PPROTO_TCP);/ Set up the sockaddr structure struct sockaddr_in saServer; saServer.sin_family = AF_INET; saServer.sin_addr.s_addr = inet_addr(“10.0.0.1”); saServer.sin_port = htons(7000)

4、;/ Bind the listening socket using the / information in the sockaddr structure bind(sockfd,(struct sockaddr *) ,2: Socket编程基础,6,bind System Call 参数解释,. struct sockaddr_in saServer; bind(sockfd,(struct sockaddr *) ,注意两个表示地址的结构体的区别!,2: Socket编程基础,7,套接口地址 strcut,struct sockaddr u_short sa_family; char

5、sa_data14; ; struct sockaddr_in u_short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero8; ;,struct in_addr u_long s_addr; ;struct sockaddr_in6 u_short sin6_family; u_short sin6_port; u_long sin6_flowinfo; struct in6_addr sin6_addr; u_long sin6_scope_id; ;,2: Socket编程基础,8,byte or

6、der,不同类型CPU的电脑中,内存存储multi-bytes整数序列有两种方法: 小端序(little-endian) - 低序字节存储在低地址 大端序(big-endian)- 高序字节存储在低地址 网络中传输的数据必须按网络字节序,即大端序 Intel CPU采用小端序做主机序 所以在大部分PC机上,当应用进程将整数送入socket前,需要转化成网络序;当应用进程从socket取出整数后,要转化成主机序,2: Socket编程基础,9,listen System Call,listen通知内核:进程已准备好在这个socket上accept incoming connections lis

7、ten将套接口类型从主动(active)套接口转换成被动(passive)套接口;将套接口状态从CLOSED转换到LISTEN 函数第二个参数指定在此套接口排队的最大connections数量int listen(int sockfd, int backlog); 典型用例listen(sockfd, 5) 队列满了,socket如何响应新的syn?,2: Socket编程基础,10,accept System Call,在server进程调用listen之后,server进程接着调用accept等待client的连接请求。int accept(int sockfd, struct socka

8、ddr* clientaddr, int * addrlen);返回:非负描述字 成功, -1 失败 典型用例int connfd=accept(sockfd, NULL, NULL);,2: Socket编程基础,11,TCP Server Process启动流程总结,启动,socket,bind,listen,accept,开始send / recv数据,2: Socket编程基础,12,connect System Call,client端进程调用connect函数与tcp server建立连接int connect(int sockfd, struct sockaddr * serva

9、ddr, int addrlen); 典型用例connect(sockfd, (struct sockaddr *) connect失败的情况 ETIMEDOUT ECONNREFUSED - RST EHOSTUNREACH,2: Socket编程基础,13,Socket 通信流程总结,启动,socket,bind,listen,accept,开始send / recv数据,启动,socket,connect,开始send / recv数据,Server启动流程,Client启动流程,2: Socket编程基础,14,send System Call,send系统调用在一个已连接套接口上发送

10、数据int send(int sockfd, const char* buf, int len, int flags ); 典型用例send(connectSocketfd, sendbuf,strlen(sendbuf), 0 ); 如果socket output buffer已经没有剩余空间,send调用将会一直阻塞(block),或者说调用send的进程会一直sleep,直到buffer腾出空间,2: Socket编程基础,15,recv System Call,recv系统调用在一个已连接套接口上接收数据int recv(int sockfd, char* buf, int len,

11、int flags ); 典型用例recv(connectSocketfd, recvbuf,recvbuflen, 0 ); 如果socket input bufffer没有数据,recv调用将在数据到来前一直block,即进程一直sleep recv调用中虽然指定了期待接收的字节数len, 但recv方法可能在未读取到len个字节的信息就返回:TCP是字节流协议的特征,2: Socket编程基础,16,close/closesocket,close系统调用(Linux适用)和closesocket(windows适用)关闭一个套接口int close(int sockefd); int c

12、losesocket(int sockefd); 典型用例close(connectSocketfd); close关闭socket后,socket不能再进行读或写,接着TCP自动触发连接终止序列,2: Socket编程基础,17,Quiz,考虑在TCP/IP网络中如何处理以下两个场景的需求 场景一:主机A连续发送三个字符串给主机B 1. Hello 2.Mail received 3.Thanks 场景二:主机A连续发送三个二进制文件给主机B 1. book.doc 文件大小:2,100K 2.flower.jpg 文件大小:30K 3.cup.xsl 文件大小:800K,2: Socket编程基础,18,练习:,编写Client,Server程序。三路握手成功后, client端发送字符串:c:net_test,请求server端程序将server端主机上C盘根目录下net_test文件发送给client端程序; server端在指定路径查找文件,若找到请求文件立即将其发送给client端程序;否则发送字符串file not found 给client端; client端收到文件后,用其原始文件名保存到client端主机的C盘根目录;若收到file not found,则打印在屏幕上; 双方调用closesocket()结束此次TCP/IP通信,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号