- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
网络编程技术第五讲 数据报套接字;Outline;Outline;2014/5/29;User Datagram Protocol,用户数据报协议
无连接,适合多对多通信
提供不可靠服务
缺乏流控制
报文模式传输;Outline;
推荐
在可靠的本地环境中运行;
广播和多播应用程序
不推荐
在不可靠的广域网环境中运行;
海量数据传输;服务器通信过程:
socket初始化;
创建套接字,指定使用UDP(不可靠的传输服务)进行通信;
指定本地地址和通信端口;
进行数据传输;
关闭套接字;
结束对windows sockets dll的使用。;客户端通信过程:
socket初始化;
创建套接字,指定使用UDP(不可靠的传输服务)进行通信;
指定服务器的地址和通信端口;
进行数据传输;
关闭套接字;
结束对windows sockets dll的使用。;9;2014/5/29;非连接模式
sendto(指明目标)
recvfrom(记录来源)
连接模式
connect(指明远程端点地址)
sendto/send
recvfrom/recv;使用连接模式的客户端编程;Outline;函数定义:
SOCKET socket(int af, int type, int protocol);
输入参数:
af:指定网络地址类型,一般取AF_INET,表示该套接字在Internet域中进行通信;
type:指定套接字类型,这里取SOCK_DGRAM,表示创建的套接字是数据报套接字;
protocol:指定网络协议,取0表示默认为TCP/IP协议。
返回值:
正确:创建的套接字句柄SOCKET
错误:INVALID_SOCKET (WSAGetLastError)
功能:创建一个套接字,用于以后的数据传输
说明:该函数调用指定了五元组中的“协议”一元。服务器和客户端都要创建,服务器总是先于客户进程启动。
;函数定义:
int bind(SOCKET s, const struct sockaddr* name, int namelen);
输入参数:
s:标识一个未捆绑套接字的句柄,用来等待客户机的连接;
name:赋予套接字的地址,由struct sockaddr结构表示;
namelen:name字段的值长度,以字节为单位。
返回值:
正确:0
错误:SOCKET_ERROR (WSAGetLastError)
功能:将本地地址绑定到所创建的套接字上以在网络上标识该套接字。
;函数定义:
int sendto(SOCKET s, const char FAR* buf, int len, int flags, const struct sockaddr FAR* to, int tolen)
输入参数:
s:套接字标识
buf:存放发送数据的缓冲区
len:发送数据的字节总数
flags:对发送数据的处理方式
MSG_DONTROUTE:不要路由;MSG_OOB:带外数据
to:指定数据接收方主机的IP地址和端口号
当要发送的数据是以广播方式发送时,将目的地址to设置为INADDR_BROADCAST
tolen:地址to的长度
;;函数定义:
int recvfrom(SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen)
输入参数:
s:套接字标识
buf:接收数据的缓冲区
len:指明buf的字节数
flags:指定处理数据的方式;
MSG_OOB:处理带外数据;MSG_PEEK:保留数据
from:提取数据发送方的IP地址和端口号
fromlen:from的长度;;函数定义:
int closesocket(SOCKET s)
输入参数:
s:套接字标识
返回值:
成功:0
失败:SOCKET_ERROR
功能:关闭套接字,释放分配给该套接字的资源;
;
怎样指明目标
连接模式
connect(……,struct sockaddr FAR* name,……)
非连接模式
sendto(……,const struct sockaddr FAR* to,……)
怎样获知来源
连接模式
connect(……,struct sockaddr FAR* name,……)
非连接模式
recvfrom(……,struct sockaddr FAR* from,……);
;
发送(send vs. sendto)
send()
用于SOCK_STREAM:最常用
用于SOCK_DGRAM:套接字地址通过连接函数connect获得
sendto()
用于SOCK_DG
文档评论(0)