华清远见就业优势倍增项目手册

Similar documents
Chapter #

VoIP Make a Rtp Call VoIP Abstract... 2 VoIP RTP...3 Socket IP...9 Config Two Voice-hub

TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP

Chap04

9 Internet 10 Internet

Chapter 5- 运输层 (5)-2017

untitled

/ / (FC 3)...

Microsoft PowerPoint - 数据通信-ch1.ppt

第 1 章 概 述 1.1 计 算 机 网 络 在 信 息 时 代 中 的 作 用 1.2 计 算 机 网 络 的 发 展 过 程 *1.2.1 分 组 交 换 的 产 生 *1.2.2 因 特 网 时 代 *1.2.3 关 于 因 特 网 的 标 准 化 工 作 计 算 机 网 络 在

经华名家讲堂

工程师培训

计算机网络编程

DOS下常用的网络命令.PDF

<4D F736F F F696E74202D20A1B6CFEEC4BFD2BB20B3F5CAB6BCC6CBE3BBFACDF8C2E7A1B7C8CECEF1C8FD20CAECCFA A1A24950D0ADD2E9BACD4950B5D8D6B72E707074>


Microsoft PowerPoint - Socket programming.ppt [相容模式]

UDP 8.2 TCP/IP OSI OSI 3 OSI TCP/IP IP TCP/IP TCP/IP Transport Control Protocol TCP User Datagram Protocol UDP TCP TCP/IP IP TCP TCP/IP TC

网络程序设计(socketAPI)

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco

C6_ppt.PDF

財金資訊-80期.indd

MASQUERADE # iptables -t nat -A POSTROUTING -s / o eth0 -j # sysctl net.ipv4.ip_forward=1 # iptables -P FORWARD DROP #

(Methods) Client Server Microsoft Winsock Control VB 1 VB Microsoft Winsock Control 6.0 Microsoft Winsock Control 6.0 1(a). 2

Data Server_new_.doc

Linux網路傳輸設定

KL DSC DEMO 使用说明

第 11 章 互聯網技術 11.1 互聯 網 和 萬 維 網 的 發 展 歷 史 A. 互聯網的發展 互聯網是由 ARPANET 開 始發展的 1969 年 美國國防部高級研究計劃署 (ARPA) 把部分軍事研究所和大 的電腦連接起來 建造了㆒個實驗性的電腦網絡 稱為 ARPANET 並 列 的功能

IP505SM_manual_cn.doc

Simulator By SunLingxi 2003

嵌入式Linux块设备驱动开发解析

ch09.PDF

一个开放源码的嵌入式仿真环境 ― SkyEye

ebook

Socket Socket TcpClient Socket.Connect TcpClient.Connect Socket.Send / Receive NetworkStream 6-5

ebook

Slide 1


R3105+ ADSL

路由器基本配置

Microsoft Word - 選擇_無解答2_.doc

ebook67-9

Microsoft PowerPoint - BECKHOFF技术_ADS通讯 [Compatibility Mode]

Microsoft Word - YDB Vehicle Telematics Service Requirement and General Framework

/3/15 1, linux. linux,,. : 1.NAT ; 2. (load balance, virtual server);; 3. ; 4. ; 5. 6.VPN; 7. ; 8. ; 9.. (,

11N 无线宽带路由器

C/C++ - 文件IO

1. 二 進 制 數 值 ( ) 2 轉 換 為 十 六 進 制 時, 其 值 為 何? (A) ( 69 ) 16 (B) ( 39 ) 16 (C) ( 7 A ) 16 (D) ( 8 A ) 在 電 腦 術 語 中 常 用 的 UPS, 其 主 要 功 能

计算机网络实验说明

AL-M200 Series

ebook140-9

第3章 计算机网络体系结构

untitled

计算机网络

自由軟體教學平台

ebook140-8

C3_ppt.PDF

end to end 7.2 OSI 7 OSI 3 A B 7.2 Packet Routing LAN WAN

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

OSI OSI 15% 20% OSI OSI ISO International Standard Organization 1984 OSI Open-data System Interface Reference Model OSI OSI OSI OSI ISO Prototype Prot

Linux网络编程socket错误分析

飞鱼星多WAN防火墙路由器用户手册

( CIP) /,. - :, ISBN TP312 CIP ( 2004 ) : ( ) : : : : /16 : 21 : 347 : : : I

Bus Hound 5

<B1B1BEA9B9E2BBB7D0C2CDF8BFC6BCBCB9C9B7DDD3D0CFDEB9ABCBBEB4B43F3F12FB6CB293>

epub

目 彔 1. 准 备 工 作 登 彔 设 置 功 能 说 明 实 时 监 控 基 本 控 制 功 能 设 置 画 质 调 节 彔 像 与 抓 拍

RAQMON Context Setting MG PDA Applications RTP / FTP/ HTTP TCP/UDP S ignaling control plane (e.g. RS VP, NS IS) Streaming Media, Transaction, Bulk dat

<4D F736F F D D352DBED6D3F2CDF8D7E9BDA8D3EBB9DCC0EDCFEEC4BFBDCCB3CCD5FDCEC42E646F63>

Transcription:

Linux 网络编程 曾宏安

1. Internet 与 TCP/IP 协议 1 2 3 4 Internet 历史 OSI 模型与 TCP/IP 协议体系结构 TCP/IP 协议 TCP 和 UDP 协议

Internet 的历史 } Internet- 冷战 的产物 } 1957 年 10 月和 11 月, 前苏联先后有两颗 Sputnik 卫星上天 } 1958 年美国总统艾森豪威尔向美国国会提出建立 DARPA (Defense Advanced Research Project Agency), 即国防部高级研究计划署, 简称 ARPA } 1968 年 6 月 DARPA 提出 资源共享计算机网络 (Resource Sharing Computer Networks), 目的在于让 DARPA 的所有电脑互连起来, 这个网络就叫做 ARPAnet, 即 阿帕网, 是 Interne 的最早雏形

网络互联促成了 TCP/IP 协议的产生 } 早期的 ARPAnet 使用网络控制协议 (Network Control Protocol,NCP), 不能互联不同类型的计算机和不同类型的操作系统, 没有纠错功能 } 1973 年由 Kahn 和 Vinton Cerf 两人合作为 ARPAnet 开发了新的互联协议 } 1974 年 12 月两人正式发表第一份 TCP 协议详细说明, 但此协议在有数据包丢失时不能有效的纠正

网络互联促成了 TCP/IP 协议的产生 } TCP 协议分成了两个不同的协议 : } 用来检测网络传输中差错的传输控制协议 TCP } 专门负责对不同网络进行互联的互联网协议 IP } TCP/IP 协议 v1, v2, v3, v4 } 1983 年 ARPAnet 上停止使用 NCP, 互联网上的主机全部使用 TCP/IP 协议 TCP/IP 协议成为 Internet 中的 世界语

1. Internet 与 TCP/IP 协议 1 2 3 4 Internet 历史 OSI 模型与 TCP/IP 协议体系结构 TCP/IP 协议 TCP 和 UDP 协议

网络的体系结构 } 网络采用分而治之的方法设计, 将网络的功能划分为不同的模块, 以分层的形式有机组合在一起 } 每层实现不同的功能, 其内部实现方法对外部其他层次来说是透明的 每层向上层提供服务, 同时使用下层提供的服务 } 网络体系结构即指网络的层次结构和每层所使用协议的集合 } 两类非常重要的体系结构 :OSI 与 TCP/IP

OSI 开放系统互联模型 } OSI 模型相关的协议已经很少使用, 但模型本身非常通用 } OSI 模型是一个理想化的模型, 尚未有完整的实现 } OSI 模型共有七层 ( 右图 ) 应用层表示层会话层传输层网络层数据链路层物理层 高层 低层

OSI 模型七层结构 面向应用 面向服务 面向通信 应用层表示层会话层传输层 应用程序 :FTP E-mail Telnet 数据格式定义 数据转换 / 加密建立通信进程的逻辑名字与物理名字之间的联系差错处理 / 恢复, 流量控制, 提供可靠的数据传输 通信子网 网络层 链路层 物理层 数据分组 路由选择 数据组成可发送 接收的帧 传输物理信号 接口 信号形式 速率

OSI 七层结构 应用层表示层会话层传输层网络层链路层物理层 比特流 应用层表示层会话层传输层网络层链路层物理层

TCP/IP 协议族的体系结构 } TCP/IP 协议是 Internet 事实上的工业标准 } 一共有四层

TCP/IP 与 OSI 参考模型的对应关系

OSI 与 TCP/IP 的对比

TCP/IP 协议 OSI 中的层 功能 TCP/IP 协议族 应用层 文件传输, 电子邮件, 文件服务, 虚拟终端 TFTP,HTTP,SNMP,FTP, SMTP,DNS,Telnet 表示层 数据格式化, 代码转换, 数据加密 没有协议 会话层 解除或建立与别的节点的联系 没有协议 传输层网络层数据链路层物理层 提供端对端的接口为数据包选择路由传输有地址的帧以及错误检测功能以二进制数据形式在物理媒体上传输数据 TCP,UDP IP,ICMP,RIP,OSPF, BGP,IGMP SLIP,CSLIP,PPP,ARP, RARP,MTU ISO2110,IEEE802.1,EEE802.2

1. Internet 与 TCP/IP 协议 1 2 3 4 Internet 历史 OSI 模型与 TCP/IP 协议体系结构 TCP/IP 协议 TCP 和 UDP 协议

TCP/IP 协议 } TCP/IP 协议 } 传输控制 / 网际协议 (Transfer Control Protocol/Internet Protocol) 又称作网络通讯协议 } Internet 国际互联网络的基础,RFC793 } 一组协议, 通常称它为 TCP/IP 协议族 } 四个层次 : 网络接口层 网际层 传输层 应用层

TCP/IP 协议族 } 常用协议 } TCP(Transport Control Protocol) 传输控制协议 } IP(InternetworkingProtocol) 网间协议 } UDP(User Datagram Protocol) 用户数据报协议 } ICMP(Internet Control Message Protocol) 互联网控制信息协议 } SMTP(Simple Mail Transfer Protocol) 简单邮件传输协议 } SNMP(Simple Network manage Protocol) 简单网络管理协议 } HTTP(Hypertext Transfer Protocol) 超文本传输协议 } FTP(FileTransfer Protocol) 文件传输协议 } ARP(AddressResolution Protocol) 地址解析协议

TCP/IP 协议通信模型

数据的封装与传递过程

发送端 : 数据打包 Application Buffer TCP/UDP Header Application Buffer IP Header TCP/UDP Header Application Buffer Ethernet Header IP Header TCP/UDP Header Application Buffer Network

接收端 : 数据解包 Application Buffer TCP/UDP Header Application Buffer IP Header TCP/UDP Header Application Buffer Ethernet Header IP Header TCP/UDP Header Application Buffer Network

TCP/IP 结构 ftp telnet mail ping 应用层 Stream Socket Stream Socket Stream Socket Raw Socket 用户模式 内核模式 TCP UDP IP (+ICMP) Device Drivers 传输层 网络层 物理层 网线

TCP/IP 协议下的数据包 Ethernet header IP header TCP header App. header User data Ethernet trailer 14 20 20 46-1500

1. Internet 与 TCP/IP 协议 1 2 3 4 Internet 历史 OSI 模型与 TCP/IP 协议体系结构 TCP/IP 协议 TCP 和 UDP 协议

UDP 和 TCP } 共同点 : 同为传输层协议 } 不同点 : } TCP: 有连接, 保证可靠 } UDP: 无连接, 不保证可靠 } MSN/QQ 使用的传输层协议?

TCP 协议特点 } TCP( 即传输控制协议 ): 是一种面向连接的传输层协议, 它能提供高可靠性通信 ( 即数据无误 数据无丢失 数据无失序 数据无重复到达的通信 ) } 适用情况 : 1. 适合于对传输质量要求较高, 以及传输大量数据的通信 2. 在需要可靠数据传输的场合, 通常使用 TCP 协议 3. MSN/QQ 等即时通讯软件的用户登录账户管理相关的功能通常采用 TCP 协议

TCP 传输

UDP 协议的特点 } UDP(User Datagram Protocol) 用户数据报协议, 是不可靠的无连接的协议 在数据发送前, 因为不需要进行连接, 所以可以进行高效率的数据传输 } 适用情况 : 1. 发送小尺寸数据 ( 如对 DNS 服务器进行 IP 地址查询时 ) 2. 在接收到数据, 给出应答较困难的网络中使用 UDP ( 如 : 无线网络 ) 3. 适合于广播 / 组播式通信中 4. MSN/QQ/Skype 等即时通讯软件的点对点文本通讯以及音视频通讯通常采用 UDP 协议 5. 流媒体 VOD VoIP IPTV 等网络多媒体服务中通常采用 UDP 方式进行实时数据传输

UDP 传输

2. TCP/IP 网络编程 1 2 3 4 预备知识系统调用 TCP 服务器 / 客户端 UDP 服务器 / 客户端

TCP/IP 网络编程预备知识 } socket } IP 地址 } 端口号 } 字节序

Socket 简介 } 1982 -Berkeley Software Distributions 操作系统引入了 socket 作为本地进程之间通信的接口 } 1986 -Berkeley 扩展了 socket 接口, 使之支持 UNIX 下的 TCP/IP 通信 } 现在很多应用 (FTP, Telnet, etc) 都依赖这一接口

Socket 简介 } socket } 是一个编程接口 } 是一种特殊的文件描述符 (everything in Unix is a file) } 并不仅限于 TCP/IP 协议 } 面向连接 (Transmission Control Protocol -TCP/IP) } 无连接 (User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX)

为什么需要 Socket } 普通的 I/O 操作过程 } 打开文件 -> 读 / 写操作 -> 关闭文件 } TCP/IP 协议被集成到操作系统的内核中, 引入了新型的 I/O 操作 } 进行网络通信的两个进程在不同的机器上, 如何连接? } 网络协议具有多样性, 如何进行统一的操作 } 需要一种通用的网络编程接口 :Socket

什么是 Socket } 独立于具体协议的网络编程接口 } 在 OSI 模型中, 主要位于会话层和传输层之间 } BSD Socket( 伯克利套接字 ) 是通过标准的 UNIX 文件描述符和其它程序通讯的一个方法, 目前已经被广泛移植到各个平台

Socket 类型 } 流式套接字 (SOCK_STREAM) } 提供了一个面向连接 可靠的数据传输服务, 数据无差错 无重复的发送且按发送顺序接收 内设置流量控制, 避免数据流淹没慢的接收方 数据被看作是字节流, 无长度限制 } 数据报套接字 (SOCK_DGRAM) } 提供无连接服务 数据包以独立数据包的形式被发送, 不提供无差错保证, 数据可能丢失或重复, 顺序发送, 可能乱序接收 } 原始套接字 (SOCK_RAW) } 可以对较低层次协议如 IP ICMP 直接访问

Socket 的位置

IP 地址 } IP 地址是 Internet 中主机的标识 } Internet 中的主机要与别的机器通信必须具有一个 IP 地址 } IP 地址为 32 位 (IPv4) 或者 128 位 (IPv6) } 每个数据包都必须携带目的 IP 地址和源 IP 地址, 路由器依靠此信息为数据包选择路由 } 表示形式 : 常用点分形式, 如 202.38.64.10, 最后都会转换为一个 32 位的无符号整数 } IP 地址分类 } 子网掩码

IP 地址的转换 } inet_aton() } 将 strptr 所指的字符串转换成 32 位的网络字节序二进制值 #include <arpa/inet.h> int inet_aton(const char *strptr,struct in_addr *addrptr); } inet_addr() } 功能同上, 返回转换后的地址 in_addr_t inet_addr(const char *strptr); } inet_ntoa() } 将 32 位网络字节序二进制地址转换成点分十进制的字符串 char *inet_ntoa(stuct in_addr inaddr);

端口号 } 为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理, 使用端口号来区别 } TCP 端口号与 UDP 端口号独立 } 端口号一般由 IANA (Internet Assigned Numbers Authority) 管理 } 众所周知端口 :1~1023(1~255 之间为众所周知端口, 256~1023 端口通常由 UNIX 系统占用 ) } 注册端口 :1024~49150 } 动态或私有端口 :49151~65535

端口号的作用 APP1 6000 APP2 7000 目标 IP 目标端口 socket1 socket2 socket3 192.168.1.100 7000 8000 192.168.1.100

套接字和端口 进程 -1 进程 -2 进程 -3 进程 -4 端口 TCP UDP IP (+ICMP) 内核 每个 socket 都和端口 协议相联系 网络层 网线

套接字和端口 保留的端口注册的端口其他端口 1 7 21 23. 1024-5000 5001-65536 tcpmux echo ftp telnet 系统分配的端口 自己分配的端口

一个比喻 } 如果把网络数据包的投递过程看成是给远方的一位朋友寄一封信, 那么 : } IP 地址就是这位朋友的所在位置, 如上海交大 XX 系, 邮局依靠此信息进行信件的投递, 网络数据则依靠 IP 地址信息进行路由 } 端口号就是这位朋友的名字, 传达室依靠这个信息最终把这封信交付给这位收信者, 数据包则依靠端口号送达给接收进程

字节序 } 不同类型 CPU 的主机中, 内存存储多字节整数序列有两种方法, 称为主机字节序 (HBO): } 小端序 (little-endian) - 低序字节存储在低地址 } 将低字节存储在起始地址, 称为 Little-Endian 字节序,Intel AMD 等采用的是这种方式 ; } 大端序 (big-endian)- 高序字节存储在低地址 } 将高字节存储在起始地址, 称为 Big-Endian 字节序, 由 ARM Motorola 等所采用 } 网络中传输的数据必须按网络字节序, 即大端字节序 } 在大部分 PC 机上, 当应用进程将整数送入 socket 前, 需要转化成网络字节序 ; 当应用进程从 socket 取出整数后, 要转化成小端字节序 ( 原因?)

字节序 } 网络字节序 (NBO -Network Byte Order) } 使用统一的字节顺序, 避免兼容性问题 } 主机字节序 (HBO -Host Byte Order) } 不同的机器 HBO 是不一样的, 这与 CPU 的设计有关 } Motorola 68K 系列 ARM 系列,HBO 与 NBO 是一致的 } Intel X86 系列,HBO 与 NBO 不一致

字节序 } 大端 (Big-Endian): 字节的高位在内存中放在存储单元的起始位置 } 小端 (Little-Endian): 与大端相反

字节序转换函数 } 把给定系统所采用的字节序称为主机字节序 为了避免不同类别主机之间在数据交换时由于对于字节序的不同而导致的差错, 引入了网络字节序 } 主机字节序到网络字节序 } u_long htonl (u_long hostlong); } u_short htons (u_short short); } 网络字节序到主机字节序 } u_long ntohl (u_long hostlong); } u_short ntohs (u_short short);

2. TCP/IP 网络编程 1 2 3 4 预备知识系统调用 TCP 服务器 / 客户端 UDP 服务器 / 客户端

网络编程相关 API } 网络编程常用函数 } socket() 创建套接字 } bind() 绑定本机地址和端口 } connect() 建立连接 } listen() 设置监听套接字 } accept() 接受 TCP 连接 } recv(), read(), recvfrom() 数据接收 } send(), write(), sendto() 数据发送 } close(), shutdown() 关闭套接字

socket } intsocket (intdomain, int type, int protocol); } domain 是地址族 PF_INET // internet 协议 PF_UNIX // unixinternal 协议 PF_NS // Xerox NS 协议 PF_IMPLINK // Interface Message 协议 } type // 套接字类型 SOCK_STREAM // 流式套接字 SOCK_DGRAM // 数据报套接字 SOCK_RAW // 原始套接字 } protocol 参数通常置为 0

socket returns socket ID on success return -1 on error int socket_fd = socket (PF_INET, SOCK_STREAM, 0); PF_INET = 使用网络协议族 SOCK_STREAM = 使用 TCP 总是 0

地址相关的数据结构 } 通用地址结构 struct sockaddr { u_short sa_family; char sa_data[14]; }; // 地址族, AF_xxx // 14 字节协议地址 } Internet 协议地址结构 struct sockaddr_in { u_short sin_family; // 地址族, AF_INET,2 bytes u_short sin_port; // 端口,2 bytes structin_addr sin_addr; // IPV4 地址,4 bytes char sin_zero[8]; //8 bytes unused, 作为填充 };

地址相关的数据结构 } IPv4 地址结构 // internet address struct in_addr { in_addr_t s_addr; }; // u32 networkaddress

bind () } int bind(int sockfd, struct sockaddr *my_addr, int add rlen) ; } 头文件 : #include <sys/types.h> #include <sys/socket.h> } sockfd: socket 调用返回的文件描述符 } addrlen: sockaddr 地址结构的长度 } 返回值 :0 或 -1

bind () return code (-1 if error) sockfd is returned by socket() int status = bind (sockfd, (struct sockaddr *) &my_addr, sizeof(my_addr)); sockaddr_in 结构, 描述本机的端口和 IP 地址 sockaddr_in 结构的长度

bind intbind (intsockfd, structsockaddr* addr, intaddrlen); } sockfd 由 socket() 调用返回 } addr 是指向 sockaddr_in 结构的指针, 包含本机 IP 地址和端口号 struct sockaddr_in u_short sin_family // protocol family u_short sin_port // port number struct in_addr sin_addr //IP address (32-bits) } addrlen : sizeof(struct sockaddr_in)

how to fill addr info Step 1: 初始化该数据结构 struct sockaddr_in my_addr; /* My (client) Internet address */ /* Set My(client's) IP Address ---------------------------------------- */ my_addr.sin_family= PF_INET; /* Protocol Family To Be Used */ my_addr.sin_port = htons (6666); /* Port number to use */ my_addr.sin_addr.s_addr = inet_addr( 192.168.1.100 ); /* My IP address */ Step 2: 填充信息

地址结构的一般用法 1. 定义一个 struct sockaddr_in 类型的变量并清空 struct sockaddr_inmyaddr; memset(&myaddr, 0, sizeof(myaddr)); 2. 填充地址信息 myaddr.sin_family= PF_INET; myaddr.sin_port = htons(8888); myaddr.sin_addr.s_addr = inet_addr( 192.168.1.100 ); 3. 将该变量强制转换为 struct sockaddr 类型在函数中使用 bind(listenfd, (struct sockaddr*)(&myaddr), sizeof(myaddr));

地址转换函数 } unsigned long inet_addr(char*address); address 是以 NULL 结尾的点分 IPv4 字符串 该函数返回 32 位的地址 如果字符串包含的不是合法的 IP 地址, 则函数返回 -1 例如 : struct in_addr addr; addr.s_addr= inet_addr(" 192.168.1.100 "); } char* inet_ntoa(structin_addraddress); address 是 IPv4 地址结构, 函数返回一指向包含点分 IP 地址的静态存储区字符指针 如果错误则函数返回 NULL

listen intlisten (intsockfd, intbacklog); } sockfd: 监听连接的套接字 } backlog } 指定了正在等待连接的最大队列长度, 它的作用在于处理可能同时出现的几个连接请求 } DoS( 拒绝服务 ) 攻击即利用了这个原理, 非法的连接占用了全部的连接数, 造成正常的连接请求被拒绝 } 返回值 : 0 或 -1 完成 listen() 调用后,socket 变成了监听 socket(listening socket).

accept() } int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) ; } 返回值 : 已建立好连接的套接字或 -1 } 头文件 #include <sys/types.h> #include <sys/socket.h> } sockfd : 监听套接字 } addr: 对方地址 } addrlen: 地址长度 listen() 和 accept() 是 TCP 服务器端使用的函数

accept ( ) 函数 一个新的已连接的 socket (-1 if error) 接受客户连接的 socket, 即 listening socket int new_accepted_fd = accept (listen_fd, (struct sockaddr *) addr, &addrlen); 接收外来连接的地址信息, 如果不关心, 可置为 NULL 传递结构体 addr 的长度并返回对方地址的长度

connect() } int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); } 返回值 :0 或 -1 } 头文件 : #include <sys/types.h> #include <sys/socket.h> } sockfd : socket 返回的文件描述符 } serv_addr: 服务器端的地址信息 } addrlen : serv_addr 的长度 connect() 是客户端使用的系统调用

connect( ) 函数 return code (-1 if error) socket_fd returned by socket() system call int status = connect (socket_fd, (struct sockaddr *) &addr, sizeof(addr)); struct sockaddr 结构, 描述服务器的端口和 IP 地址 struct sockaddr 结构的字节长度

send() } ssize_t send(int socket, const void *buffer, size_t length, int flags); } 返回值 : } 成功 : 实际发送的字节数 } 失败 :-1, 并设置 errno } 头文件 : } #include <sys/socket.h> } buffer : 发送缓冲区首地址 } length : 发送的字节数 } flags : 发送方式 ( 通常为 0)

send ( ) 函数 on success, the number of bytes actually sent return code (-1 if error) socket returned by socket() or accept() int status = send (socket_fd, out_buffer, MAX_BUFFER_SIZE, 0); 发送数据缓冲区的首地址 The maximum buffer size Always 0

recv() } ssize_t recv(int socket, const void *buffer, size_t length, int flags); } 返回值 : } 成功 : 实际接收的字节数 } 失败 :-1, 并设置 errno } 头文件 : } #include <sys/socket.h> } buffer : 发送缓冲区首地址 } length : 发送的字节数 } flags : 接收方式 ( 通常为 0)

recv ( ) 函数 on success, the number of bytes received return code (-1 if error) Socket fd returned by socket() call int status = recv (socket_fd, in_buffer, MAX_BUFFER_SIZE, 0); 接收数据的缓冲区的地址 Example: char in_buffer [MAX_BUFFER] The maximum buffer size Always 0

read()/write() } ssize_t read(int fd, void *buf, size_tcount); } ssize_t write(int fd, const void *buf, size_tcount); read() 和 write() 经常会代替 recv() 和 send(), 通常情 况下, 看程序员的偏好 使用 read()/write() 和 recv()/send() 时最好统一

套接字的关闭 } int close(int sockfd); } 关闭双向通讯 } intshutdown(intsockfd, inthowto); } TCP 连接是双向的 ( 是可读写的 ), 当我们使用 close 时, 会 把读写通道都关闭, 有时侯我们希望只关闭一个方向, 这个时候我们可以使用 shutdown } 针对不同的 howto, 系统回采取不同的关闭方式

shutdown() 的 howto 参数 } howto= 0 关闭读通道, 但是可以继续往套接字写数据 } howto= 1 和上面相反, 关闭写通道 只能从套接字读取数据 } howto= 2 关闭读写通道, 和 close() 一样

2. TCP/IP 网络编程 1 2 3 4 预备知识系统调用 TCP 服务器 / 客户端 UDP 服务器 / 客户端

TCP 服务器端流程 socket bind listen accept send/recv close

TCP 客户端流程 socket bind < 可选 > connect send/recv close

应用举例 ( 一 ) 文件传输服务器和客户端的实现 客户端 : help : 显示帮助信息 list : 获取服务器端文件列表 get <file> : 从服务器端下载 <file> put <file> : 向服务器端上传 <file> quit : 退出客户端

文件传输客户端 从键盘读命令输入 HELP? N 输入 LIST? N 输入 GET? N 输入 PUT? N 输入 QUIT? Y Y Y Y Y ProcessHelp ProcessList ProcessGet ProcessPut 程序结束

文件传输服务器端 套接字 -> 绑定 -> 监听 接收连接 从套接字读取命令 ProcessList ProcessGet ProcessPut

2. TCP/IP 网络编程 1 2 3 4 预备知识系统调用 TCP 服务器 / 客户端 UDP 服务器 / 客户端

sendto(),recvfrom() } ssize_t sendto(int socket, void *message, size_t length, int flags, struct sockaddr*dest_addr, socklen_t dest_len); } ssize_t recvfrom(int socket, void *buffer, size_t length, int flags, struct sockaddr*address, socklen_t *address_len); 这两个函数一般在使用 UDP 协议时使用

UDP 服务器端流程 socket bind recvfrom sendto

UDP 客户端流程 socket bind < 可选 > sendto recvfrom

应用举例 ( 二 ) 局域网聊天室的实现 客户端 : 1) 发送消息 2) 接收消息 服务器端 : 1) 保存在线客户端信息 2) 转发消息

客户端 客户端 服务器 客户端 客户端

聊天室客户端流程 父进程负责发消息 创建套接字 / 发注册消息 子进程负责收消息 从键盘输入 接收消息 是否退出? N 发送广播消息 Y 发注销消息 客户端退出 显示消息

聊天室服务器端流程 创建套接字 需要创建链表保存所有在线客户端的地址 绑定地址 接收消息 注册消息 广播消息 注销消息

小结 参考书 : UNIX 网络编程 TCP/IP 详解 工具 : wireshark(ethereal) 阶段 : 功能 性能 安全

谢谢! www.farsight.com.cn csdn@farsight.com.cn qq: : 248856300 619366077