电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > DOCX文档下载
分享到微信 分享到微博 分享到QQ空间

linux socket应用编程笔记1

  • 资源ID:185267799       资源大小:1.22MB        全文页数:17页
  • 资源格式: DOCX        下载积分:5金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要5金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

linux socket应用编程笔记1

linux Socket Socket编程基本实践1Socket Api基本概念什么是socket?q socket可以看成是用户进程与内核网络协议栈的编程接口。q socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信。tcp/ip通讯模型IPv4套接口地址结构q IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文件<netinet/in.h>中struct sockaddr_in uint8_t sin_len; 4sa_family_t sin_family; 4in_port_tsin_port; 2struct in_addrsin_addr; 4char sin_zero8; 8; q sin_len:整个sockaddr_in结构体的长度,在4.3BSD-Reno版本之前的第一个成员是sin_family.q sin_family:指定该地址家族,在这里必须设为AF_INETq sin_port:端口q sin_addr:IPv4的地址;q sin_zero:暂不使用,一般将其设置为0通用地址结构q 通用地址结构用来指定与套接字关联的地址。 struct sockaddr uint8_t sin_len;sa_family_t sin_family;char sa_data14; /14; q sin_len:整个sockaddr结构体的长度q sin_family:指定该地址家族q sa_data:由sin_family决定它的形式。网络字节序q 字节序大端字节序(Big Endian)最高有效位(MSB:Most Significant Bit)存储于最低内存地址处,最低有效位(LSB:Lowest Significant Bit)存储于最高内存地址处。q 小端字节序(Little Endian)最高有效位(MSB:Most Significant Bit)存储于最高内存地址 处,最低有效位(LSB:Lowest Significant Bit)存储于最低内存地址处。q 主机字节序不同的主机有不同的字节序,如x86为小端字节序,Motorola 6800为大端字节序,ARM字节序是可配置的。q 网络字节序网络字节序规定为大端字节序字节序转换函数q uint32_t htonl(uint32_t hostlong);q uint16_t htons(uint16_t hostshort);q uint32_t ntohl(uint32_t netlong);q uint16_t ntohs(uint16_t netshort);q 说明:在上述的函数中,h代表host;n代表network s代表short;l代表long地址转换函数q #include <netinet/in.h>q #include <arpa/inet.h>q int inet_aton(const char *cp, struct in_addr *inp);q in_addr_t inet_addr(const char *cp);q char *inet_ntoa(struct in_addr in);套接字类型q 流式套接字(SOCK_STREAM)提供面向连接的、可靠的数据传输服务,数据无差错,无重复的发送,且按发送顺序接收。q 数据报式套接字(SOCK_DGRAM)提供无连接服务。不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。q 原始套接字(SOCK_RAW)2SocketApi基本编程模型TCP客户/服务器模型 简单服务器模型3Socket Api基本实践Socket API基本用法socket函数q 包含头文件<sys/socket.h>q 功能:创建一个套接字用于通信q 原型q int socket(int domain, int type, int protocol);q 参数q domain :指定通信协议族(protocol family)q type:指定socket类型,流式套接字SOCK_STREAM,数据报套接字SOCK_DGRAM,原始套接字SOCK_RAWq protocol :协议类型q 返回值:成功返回非负整数, 它与文件描述符类似,我们把它称为套接口描述字,简称套接字。失败返回-1bind函数q 包含头文件<sys/socket.h>q 功能:绑定一个本地地址到套接字q 原型q int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);q 参数q sockfd:socket函数返回的套接字q addr:要绑定的地址q addrlen:地址长度q 返回值:成功返回0,失败返回-1listen函数q 一般来说,listen函数应该在调用socket和bind函数之后,调用函数accept之前调用。q 对于给定的监听套接口,内核要维护两个队列:q 1、已由客户发出并到达服务器,服务器正在等待完成相应的TCP三路握手过程q 2、已完成连接的队列accept函数q 包含头文件<sys/socket.h>q 功能:从已完成连接队列返回第一个连接,如果已完成连接队列为空,则阻塞。q 原型q int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);q 参数q sockfd:服务器套接字q addr:将返回对等方的套接字地址q addrlen:返回对等方的套接字地址长度q 返回值:成功返回非负整数,失败返回-1connect函数q 包含头文件<sys/socket.h>q 功能:建立一个连接至addr所指定的套接字q 原型q int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);q 参数q sockfd:未连接套接字q addr:要连接的套接字地址q addrlen:第二个参数addr长度q 返回值:成功返回0,失败返回-1Socket API 中的地址复用SO_REUSEADDRq 服务器端尽可能使用SO_REUSEADDRq 在绑定之前尽可能调用setsockopt来设置SO_REUSEADDR套接字选项。使用SO_REUSEADDR选项可以使得不必等待TIME_WAIT状态消失就可以重启服务器Socket服务支持多并发(多客户端连接) 分析最基本socket服务器客户端模型能否支持多客户端连接点对点聊天程序设计与实现点对点聊天程序,功能说明点对点聊天程序,设计思想4Socket Api编程进价1流协议与粘包 流协议与粘包粘包产生的原因 说明tcp字节流 无边界udp消息、数据报 有边界对等方,一次读操作,不能保证完全把消息读完。 对方接受数据包的个数是不确定的。产生粘包问题的原因1、SQ_SNDBUF 套接字本身有缓冲区 (发送缓冲区、接受缓冲区)2、tcp传送的端 mss大小限制3、链路层也有MTU大小限制,如果数据包大于>MTU要在IP层进行分片,导致消息分割。4、tcp的流量控制和拥塞控制,也可能导致粘包5、tcp延迟发送机制 等等结论:tcp/ip协议,在传输层没有处理粘包问题。粘包解决方案 q 本质上是要在应用层维护消息与消息的边界q 定长包q 包尾加rn(ftp)q 包头加上包体长度q 更复杂的应用层协议编程实践q readnq writen2包头加上包体长度编程实践包头加上包体长度q 发报文时,前四个字节长度(转成网络字节序)+包体q 收报文时,先读前四个字节,求出长度;根据长度读数据。3包尾加上n编程实践n作为协议的边界q ssize_t recv(int s, void *buf, size_t len, int flags);q 与read相比,只能用于套接字文件描述符;q 多了一个flags MSG_OOB This flag requests receipt of out-of-band data that would not be received in the normal data stream. Some protocols place expedited data at thehead of the normal data queue, and thus this flag cannot be used with such protocols.带外数据 紧急指针 MSG_PEEKThis flag causes the receive operation to return data from the beginning of the receive queue without removing that data from the queue. Thus, asubsequent receive call will return the same data.可以读数据,不从缓存区中读走,利用此特点可以方便的实现按行读取数据。 一个一个字符的读,方法不好;多次调用系统调用read方法4获取本机ip相关函数getsockname & getpeername 获取本地的地址(注意是已连接以后的套接字)NAME getsockname - get socket nameSYNOPSIS #include <sys/socket.h> int getsockname(int s, struct sockaddr *name, socklen_t *namelen);struct sockaddr_in localaddr;socklen_t addrlen = sizeof(localaddr);/获取本地的地址if (getsockname(sock, (struct sockaddr*)&localaddr, &addrlen) < 0)ERR_EXIT("getsockname");printf("ip=%s port=%dn", inet_ntoa(localaddr.sin_addr), ntohs(localaddr.sin_port);gethostname、gethostbyname、gethostbyaddrq gethostname、gethostbyname、gethostbyaddr The domain name queries carried out by gethostbyname() and gethostb

注意事项

本文(linux socket应用编程笔记1)为本站会员(卷****络)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.