PartII基于LinuxMSWindows的Socket编程

上传人:宝路 文档编号:52505833 上传时间:2018-08-22 格式:PPT 页数:186 大小:811.11KB
返回 下载 相关 举报
PartII基于LinuxMSWindows的Socket编程_第1页
第1页 / 共186页
PartII基于LinuxMSWindows的Socket编程_第2页
第2页 / 共186页
PartII基于LinuxMSWindows的Socket编程_第3页
第3页 / 共186页
PartII基于LinuxMSWindows的Socket编程_第4页
第4页 / 共186页
PartII基于LinuxMSWindows的Socket编程_第5页
第5页 / 共186页
点击查看更多>>
资源描述

《PartII基于LinuxMSWindows的Socket编程》由会员分享,可在线阅读,更多相关《PartII基于LinuxMSWindows的Socket编程(186页珍藏版)》请在金锄头文库上搜索。

1、Part II 基于Linux/MS Windows的Socket编程,简单的时间日期程序客户端(IPv4),daytimetcpcli.c简介 包含头文件 创建TCP socket 指定服务器IP与端口 与服务器建立连接 读取并显示服务器应答 终结程序,简单的Daytime客户端 (IPv6),daytimetcpcli6.c 服务器地址结构体sockaddr_in6 if ( (sockfd = socket(AF_INET6, SOCK_STREAM, 0) 0) servaddr.sin6_family = AF_INET6; servaddr.sin6_port = htons(13

2、); if (inet_pton(AF_INET6, argv1, &servaddr.sin6_addr) = 0),错误管理: 包裹函数,sockfd = Socket(AF_INET, SOCK_STREAM, 0); 大写字母开头 lib/wrapsock.c Unix errno Value-错误码,简单Daytime服务器(IPv4) (迭代服务器),daytimetcpsrv1.c 介绍 创建 TCP socket 绑定服务器端口 将socket转换为监听socket 接受客户端连接,作出应答 终止连接,简单Daytime服务器(IPv6) (迭代服务器 ),daytimetcp

3、srvv6.c简介,结构体 函数 代码 #define in_addr_t unsinged int struct sockaddr_in serv,Socket地址结构体 (1),IPv4 Socket地址结构体 #include / linux/windows,所需要数据类型,注意,长度成员sin_len的设置和检查可选 sin_family, sin_addr, sin_port,等三个成员为必须的 in_addr_t 为32位以上的无符号整数 in_port_t 为16位以上的整数 sa_family_t可为任何类型的无符号整数 无论 IPv4 地址的TCP端口还是 UDP端口 都必须

4、存储为网络字节顺序 serv.sin_addr指32位的IPV4地址,以 in_addr 结构存储,而 serv.sin_addr.s_addr 指相同的32位IPv4地址的in_addr_t形式,Socket地址结构 (2),通用Socket地址结构 #define SA struct sockaddr,Socket地址结构 (3),IPv6 Socket 地址结构 (RFC 3493),Socket地址结构传送过程,绑定(bind) 连接(connect) 传输(sendto),Socket地址结构接收过程,Accept Recvfrom Getsockname getpeername,字

5、节顺序函数,Internet协议使用 big-endian 字节顺序 -网络字节顺序,字节顺序转换函数,h(host)主机标准, n (network)网络标准, s (short)短整数标准 , l (long)长整数标准 .,Berkeley-derived 函数 ANSI C函数,地址转换 (1),inet_aton 将C语言字符串从 strptr 转换到 32位网络字节顺序, 存储到addrptr inet_addr 作与同样的转换,但已废弃 inet_ntoa 转换32位网络顺序IPv4 地址为C标准字符串,地址转换(2),family : AF_INET或 AF_INET6 ine

6、t_pton转换字符串指针strptr为网络格式,保存到addrptr inet_ntop 转换网络数字(addrptr) 为数字指针(strptr). len为目标的长度, 防止内存溢出,地址转换 (3),#define INET_ADDRSTRLEN 16 /* for IPv4 dotted-decimal */#define INET6_ADDRSTRLEN 46 /* for IPv6 hex string */,例1,例2,协议无关函数,函数使用自己的静态缓存 保存结果,返回值为 缓存的指针 注意函数使用的是静态缓存,使用时要保证线程安全。 函数的实现(lib/sock_ntop.

7、c ),协议无关函数(1),协议无关函数 (2),sock_bind_wild binds the wildcard address and an ephemeral port to a socket. lib/sock_bind_wild sock_cmp_addr compares the address portion of two socket address structures. lib/sock_cmp_addr sock_cmp_port compares the port number of two socket address structures. sock_get_po

8、rt returns just the port number, sock_ntop_host converts just the host portion of a socket address structure to presentation format sock_set_addr sets just the address portion of a socket address structure to the value pointed to by ptr, sock_set_port sets just the port number of a socket address st

9、ructure. sock_set_wild sets the address portion of a socket address structure to the wildcard.,一些有用的函数,filedes is considered as a socket descriptor. lib/readn.c lib/writen.c lib/readline.c,Windows中地址转换函数,INT WSAStringToAddress( LPTSTR AddressString, INT AddressFamily, LPWSAPROTOCOL_INFO lpProtocolIn

10、fo, LPSOCKADDR lpAddress, LPINT lpAddressLength ); Parameters AddressString in 字符串形式的地址,需要有结束标记(0,NULL). AddressFamily in 地址协议簇. lpProtocolInfo in (可选) WSAPROTOCOL_INFO 结构体,相关的协议提供者.如置为NULL, 则为支持AddressFamily中协议簇的第一个提供者. lpAddress out 单一的 sockaddr结构体缓存. lpAddressLength in, out 输入地址缓存长度.返回结果的sockaddr

11、结构体大小.如果缓存不足,则函数失败(产生WSAEFAULT错误 ),并将lpAddressLength修改为所需要的大小. Return Values 成功则返回0.否则返回SOCKET_ERROR 具体错误号可由 WSAGetLastError获得,Similar to inet_pton() for linux,Windows下地址转换函数,INT WSAAddressToString( LPSOCKADDR lpsaAddress, DWORD dwAddressLength, LPWSAPROTOCOL_INFO lpProtocolInfo, OUT LPTSTR lpszAddr

12、essString, IN OUT LPDWORD lpdwAddressStringLength ); Parameters lpsaAddress in sockaddr结构体,需要转换为string的对象. dwAddressLength in sockaddr的长度,根据协议不同而不同. lpProtocolInfo in (可选) WSAPROTOCOL_INFO结构体,如果为空NULL, 则请求为第一个支持 lpsaAddress中相关协议的提供者. lpszAddressString in 用于接收转换好的字符串. lpdwAddressStringLength in, out

13、输入地址字符串的缓存长度,返回写入缓存字符串的实际长度,包含结束符号(0). 如果缓存长度不足,函数返回错误 WSAEFAULT并将 lpdwAddressStringLength置为需要的长度. 返回值 成功则返回0,否则返回SOCKET_ERROR ,具体错误号可由 WSAGetLastError 函数获得.,与UNIX中的inet_ntop()相似,基础TCP Socket编程,基本 TCP客户端/服务器的Socket函数,send(),send(),recv(),recv(),closesocket(),closesocket(),recv(),socket() 函数,要执行网络I/O

14、(读写),必须首先调用socket函数, 指定要使用的通信协议(TCP using IPv4, UDP using IPv6 etc).,socket() 函数,参数 family AF_INET: for IPv4 AF_INET6: for IPv6 type SOCK_STREAM: TCP协议 SOCK_DGRAM: UDP协议 SOCK_RAW: 基于IPv4/IPv6协议 protocol IPPROTO_TCP: TCP IPPROTO_UDP: UDP 编程时调用所返回的ID,或socket 套接字(SOCKET),connect() 函数,connect用于建立TCP客户端

15、到服务器的连接sockfd 为socket函数返回的ID socket地址结构体servaddr 必须包含服务器 IP地址与端口号 在使用TCP协议时,connect函数实现三次握手协议. 函数一直到成功或失败时才返回值,bind函数,bind本地地址(IPv4 or IPv6) 提交给socket myaddr 为一个 协议相关的 地址 服务器会在启动时绑定well-known端口,继.,TCP客户端或服务器不指定端口,内核在监听或连接时选择一个临时端口。对 TCP 客户端而言,通常让内核选择临时端口, 除非应用程序需要保护某个端口, 但TCP服务器很少这样做, 服务器需要绑定到它们的wel

16、l-known端口.,继.,继.,在IPv4/IPv6中wildcard(通配)地址使用 INADDR_ANY/ in6addr_any 设置,listen函数,listen函数仅由 TCP服务器调用,执行两个事务: 当socket已创建时,假定它是激活的socket,也就是说,可以作为客户socket组织一个连接. listen函数转换一个 未连接的socket 为被动socket, 指定内核应该接受相应的连接 第二个参数则指定能够接受的最大连接数.,继.,通常此函数在 socket 与bind之后调用, 必须在 accept 之前调用. 对于指定的监听socket,内核维护两个队列: 未完成的连接队列 已完成的连接队列,TCP 监听socket的两个队列,三次握手协议,accept 函数,accept 函数返回已完成队列中的下一个连接, 如果队列为空,则进程执行Sleep等待,

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

最新文档


当前位置:首页 > 中学教育 > 教学课件

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