1 实验二、 TCP 、 UDP 通信程序设计实验 ——TCP 通信实验 注意 bind 和 listen socket() bind() listen() accept() write() read() TCP Server read() socket() TCP Client connect()

Slides:



Advertisements
Similar presentations
面向侧面的程序设计 方林博士 本文下载地址:
Advertisements

网络应用程序设计 - unit 07 I/O 模型. 2 主要内容  I/O 模型  阻塞式 I/O 模型  非阻塞式 I/O 模型  输入输出多路复用 I/O 模型  信号驱动 I/O 模型.
Ch5 Linux Network Programming Jianjian SONG Software Institute, Nanjing University Nov
高级服务器设计和实现 1 —— 基础与进阶 余锋
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
公务员制度若干问题分析. 一、职业选择?身份选择? 2 。职业选择?身份选择? 公共职位世袭现象普遍存在的原因,除了 缺乏政治权力约束机制外,还包括政治道 德和官僚伦理的全面崩溃。 据中国大陆媒体披露,河南省固始县在 2008 年全县选拔正科级和县局级干部过程 中,最后任命的 12 名乡长,基本都是当地.
NAT与ICMP交互.
第11章 应用程序开发.
马志强 软件学院501室 网络应用开发 马志强 软件学院501室
第十五章 网络编程.
TCP/IP Socket网络编程.
计算机系统安全 第10章 常用攻击手段.
TCP Session Hijack 郭军权
Socket.
基于WinSock的邮件系统 1 设计目标: 1.1 SMTP发送邮件服务器(c语言) 1.2 POP3接受邮件服务器(c语言)
实验4 基于Socket的C/S程序开发 实验目的
计算机网络实验介绍 信息网络实验室 2017/9/13 04:55:22.
第7章 嵌入式网络程序设计 本章将学习如何开发嵌入式Linux系统的网络应用程序。  嵌入式系统处理的主要以太网协议和TCP/IP协议;
Advanced Sockets Programming
标准TCP/IP编程接口 ——Socket
TCP、UDP 通信实践 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
第12章 嵌入式系统的应用程序开发.
Socket Programming in C
Socket Programming.
Socket 基本觀念.
Socket () and TCP client-server
TCP/IP Protocol Suite TCP/IP協定 第二組 投影片製作by簡嘉宏 綦凱宏 林睿敏 滕孟哲.
Socket Programming.
在一定程度上 人类的思维产生于 简单个体之间的相互作用 ——Marvin Minsky.
SOCKET编程原理.
网络常用常用命令 课件制作人:谢希仁.
套接字API调用.
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
Windows网络操作系统管理 ——Windows Server 2008 R2.
作業系統實習課(四) -檔案管理- 實驗室:720A 助教:鄧執中.
第2章 套接字网络编程基础 2.1 UNIX套接字网络编程接口的 产生与发展 2.2 套接字编程的基本概念 2.3 面向连接的套接字编程
THE C PROGRAMMING LANGUAGE
第3章 WinSock 编程 3.1 Windows Sockets 概述 3.2 WinSock 库函数 3.3 网络应用程序的运行环境
如何生成设备节点 广州创龙电子科技有限公司
Linux 文件操作——系统调用和标准 IO 库
第 8 章 网络程序设计.
(第2版).
Web Server 王宏瑾.
5.3 简单的tcp通讯 信息工程系 向模军 Tel: QQ:
SOA – Experiment 2: Query Classification Web Service
Westmont College 网络应用软件 第一讲 (客户-服务器 概念, 协议端口的使用, 套接字API)
计算机网络技术及应用 制作:重庆大学 郭松涛.
Window Socket 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
Advister: Quincy Wu Speaker: Chenglin Tsai Date:3/26
_08遍历物理网卡 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
DQMClientDim.cxx及双光子练习
實驗目的: 明瞭DHCP運作原理 建置DHCP伺服器
实验七 安全FTP服务器实验 2019/4/28.
计算机网络与网页制作 Chapter 07:Dreamweaver CS5入门
面向非连接的 SOCKET编程 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
SOCKET( ).
Select模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
2019/5/3 JAVA Socket(UDP).
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 类型、对象、运算符和表达式.
Visual Basic程序设计 第13章 访问数据库
WSAAsyncSelect 模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang
_07多连接之select模型 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
第十二章 位运算.
阻塞式模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
助教:廖啟盛 JAVA Socket(UDP) 助教:廖啟盛
Internet课程设计 教师:陈 妍 朱海萍 西安交通大学计算机系
Visual C++网络通信编程 2007年8月.
Presentation transcript:

1 实验二、 TCP 、 UDP 通信程序设计实验 ——TCP 通信实验 注意 bind 和 listen socket() bind() listen() accept() write() read() TCP Server read() socket() TCP Client connect() write() read() close() 连接建立 客户请求 服务器响应 结束连接 close()

2 基本套接口函数 (1)- socket() int fd; /* socket descriptor */ if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) } fprintf(stderr,“socket creating error\n”); exit(1); }/* 注:在 TCP 或 UDP 编程的时候, protocol 都取 0*/ 类型 (type) SOCK_STREA M SOCK_DGRAM SOCK_RAW 解释字节流套接口数据报套接口原始套接口 domain=AF_INE T TCPUDPIPv4 #include int socket(int domain, int type, int protocol); 创建 socket 返回:非负整数描述符表示成功, -1 表示出错 domain 一般设为 AF_INET , protocol 一般设为 0

3 基本套接口函数 (2)- connect() #include int connect(int sockfd, struct sockaddr * servaddr, unsigned int addrlen); 返回: 0 表示成功, -1 表示出错 connect() 由客户使用, 旨在和服务器建立一个连接。 sockfd 是函数 socket() 返回的套接口描述符, servaddr 表 示远程服务器的套接口, addrlen 表示套接口地址的长度 注意:之前要先调用 socket() 创建套接口

4 TCP 通信 - 客户端例子 int fd;/* 套接口描述符 */ struct sockaddr_in srv;/* 套接口地址结构 */ fd = socket(AF_INET, SOCK_STREAM, 0) ; /* connect: AF_INET 表示使用 Internet 地址族 */ srv.sin_family = AF_INET; /* connect: 目标是连向服务器的 8000 号端口 */ srv.sin_port = htons(8000); /* connect: 目标服务器的 IP Address 是 “ ” */ srv.sin_addr.s_addr = inet_addr(“ ”); if(connect(fd, (struct sockaddr*) &srv, sizeof(srv)) < 0) { fprintf(stderr, ”connect error!\n"); exit(1); } struct sockaddr_in { short int sin_family; /* 通信类型 2 字节 */ unsigned short int sin_port; /* 端口, 2 字节 */ struct in_addr sin_addr; /* Internet 地址, 4 字节 */ unsigned char sin_zero[8]; } struct in_addr { unsigned long s_addr; }; inet_addr unsigned long inet_addr(const char *cp); 例如将 “ ” 转化为 0xC0A8000A

5 基本套接口函数 (3)- bind() #include int bind(int sockfd, struct sockaddr * servaddr, unsigned int addrlen); 返回: 0 表示成功, -1 表示出错 bind 将本机地址 ( 某个或全部地址 ) 与套接口绑定在一起 一般用于服务器绑定自己公认的服务端口号 客户端一般会在调用 connect 函数时,系统自动为客户 选择一个大于 1024 的端口号,并用客户本地 IP 地址填充 套接口地址中的相关项

6 基本套接口函数 (4)- listen() #include int listen(int sockfd, int backlog); 返回: 0 表示成功, -1 表示出错 listen 只被 TCP 服务器所使用! 函数 listen 将一个套接口转换为侦听套接口 (listening socket), 因为每个套接口在创建的时候都是主动套接口,等待使用 connect 函数发起连接。而 listen 将套接口转化为被动的,指 示内核应接收来自此套接口的连接请求。 backlog 参数指示了内核为此套接口排队的最大连接数目

7 基本套接口函数 (5)- accept() #include int accept(int sockfd, struct sockaddr * addr, unsigned int * addrlen); 返回:非负描述符表示成功, -1 表示出错 函数 accept 由 TCP 服务器在 listen 函数之后调用, 它从侦听 的套接口的完成连接队列中接收一个连接, 若已完成连接 为空, 那么该进程进入睡眠, 处于等待连接的方式 参数 sockfd 指定侦听的套接口描述符, addr 和 addrlen 用以 返回与服务器相连接的客户的协议地址信息, 如果对客户 地址和端口感兴趣, 则可以从 addr 中提取相关信息 函数 accpet 最终返回一个新的套接口描述符, 以标识连接 该函数是阻 塞型!!!

8 基本套接口函数 (6)- 其它 #include int read( int fd, char *buf, int len); 返回实际接收的缓冲区大小 int write(int fd, char *buf, int len); 返回实际发送的缓冲区大小 int close(int sockfd); int closesocket(int sockfd); 成功返回 0, 否则返回 -1 还有一些其他的发送接收函数, 感兴趣者可以查阅帮助

9 TCP 通信 - 服务器例子 int fd;/* 套接口描述符 */ struct sockaddr_in srv;/* 套接口地址结构 */ fd = socket(AF_INET, SOCK_STREAM, 0) /* AF_INET 表示使用 Internet 地址族 */ srv.sin_family = AF_INET; /* 将 socket 绑定到 8000 号端口,将主机存储方式转化为网络存储方式 */ srv.sin_port = htons(8000); /* bind: INADDR_ANY 表示服务器将接收来自本机上任何一块网卡的客户连 接 将主机存储方式转化为网络存储方式 */ srv.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(fd, (struct sockaddr*) &srv, sizeof(srv)) < 0) { fprintf(stderr, ”bind error!\n"); exit(1); }

10 if(listen(fd, 5) < 0) { fprintf(stderr, ”listen error!\n"); exit(1); } newfd = accept(fd, (struct sockaddr*) &cli, &cli_len); if(newfd < 0) { fprintf(stderr, "accept error\n"); exit(1); } TCP 通信 - 服务器例子(续)

11 要求使用 linux 编写通信程序 – Linux 下,写好源代码后, gcc file.c – o xxx ;运行则用./xxx 注意对调用函数进行错误检查及处理 – 例如 if(listen(fd, 5) < 0) … socket 用完之后要调用 close 关闭连接 进一步的思考 – 程序的水平取决于连接建立后的读写操作的设计,当然 良好的用户界面也很重要 – accept 函数是一个阻塞型函数 —— 多线程的用武之地 实验二、 TCP 、 UDP 通信程序设计实验 ——TCP 通信实验注意事项

12 实验二、 TCP 、 UDP 通信程序设计实验 ——UDP 通信实验 socket() bind() recvfrom() sendto() UDP Server socket() UDP Client sendto() recvfrom() close() 阻塞型,直到接收到 客户发送过来的数据报 data request data reply

13 基本套接口函数 (7) #include int recvfrom(int sockfd, void * buf, int len, int flags, struct sockaddr * from, unsigned int *addrlen); int sendto(int sockfd, const void * msg, int len, int flags, const struct sockaddr * to, unsigned int addrlen); 与 TCP 不同的是, UDP 在通信时, 系统内部不记录套接口地址 信息, 都是函数中主动以参数的形式指明的. 在 TCP 情况下, 客 户 connect 成功后 ( 服务器 accept 成功后 ), 每次发送接收都只 需指定套接口描述符就行了, 但是这里每次发送接收都需要额 外附加上对方的套接口地址信息. 阻塞型函数 需要服务器地址信 息,由程序员填写 返回发送方地 址信息,由函 数填写

14 UDP 通信 - 服务器端例子 int fd;/* 套接口描述符 */ struct sockaddr_in srv;/* 服务器绑定的套接口地址信息 */ fd = socket(AF_INET, SOCK_DGRAM, 0) ; srv.sin_family = AF_INET ; srv.sin_port = htons(8000); srv.sin_addr.s_addr = htonl( INADDR_ANY ); if( bind (fd, (struct sockaddr*) &srv, sizeof(srv))<0) { fprintf(stderr, "bind error!\n"); exit(1); }

15 struct sockaddr_in cli; char buf[512]; int cli_len = sizeof(cli); int nbytes; nbytes = recvfrom(fd, buf, sizeof(buf),0/*flags*/, (struct sockaddr*) &cli, &cli_len); if(nbytes < 0) { fprintf(stderr,“recvfrom error\n”); exit(1); } UDP 通信 - 服务器端例子 ( 续 )

16 UDP 通信 - 客户端例子 int fd;/* socket descriptor */ struct sockaddr_in srv;/* used by sendto() */ /* 1) create the socket */ /* sendto: send data to IP Address “ ” port 8000 */ srv.sin_family = AF_INET; srv.sin_port = htons(8000); srv.sin_addr.s_addr = inet_addr(“ ”); nbytes = sendto(fd, buf, sizeof(buf), 0 /* flags */, (struct sockaddr*) &srv, sizeof(srv)); if(nbytes < 0) { fprintf(stderr,“sendto error\n”);exit(1); }