全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络编程:关于linux下的setsockopt closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket,要设置一下socket(在bind()绑定socket前调用setsockopt函数)unsigned int re_use_addr = 0x01;if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(const void*)&re_use_addr,sizeof(re_use_addr)fprintf(stderr,setsockopt:%sna,strerror(errno);return -1;功能描述: 获取或者设置与某个套接字关联的选 项。选项可能存在于多层协议中,它们总会出现在最上面的套接字层。当操作套接字选项时,选项位于的层和选项的名称必须给出。为了操作套接字层的选项,应该 将层的值指定为SOL_SOCKET。为了操作其它层的选项,控制选项的合适协议号必须给出。例如,为了表示一个选项由TCP协议解析,层应该设定为协议 号TCP。用法:#include #include int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen);int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);参数:sock:将要被设置或者获取选项的套接字。level:选项所在的协议层。optname:需要访问的选项名。optval:对于getsockopt(),指向返回选项值的缓冲。对于setsockopt(),指向包含新选项值的缓冲。optlen:对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。对于setsockopt(),现选项的长度。返回说明:成功执行时,返回0。失败返回-1,errno被设为以下的某个值EBADF:sock不是有效的文件描述词EFAULT:optval指向的内存并非有效的进程空间EINVAL:在调用setsockopt()时,optlen无效ENOPROTOOPT:指定的协议层不能识别选项ENOTSOCK:sock描述的不是套接字参数详细说明:level指定控制套接字的层次.可以取三种值:1)SOL_SOCKET:通用套接字选项.2)IPPROTO_IP:IP选项.3)IPPROTO_TCP:TCP选项.optname指定控制的方式(选项的名称),我们下面详细解释optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换选项名称说明数据类型=SOL_SOCKET-SO_BROADCAST允许发送广播数据intSO_DEBUG允许调试intSO_DONTROUTE不查找路由intSO_ERROR获得套接字错误intSO_KEEPALIVE保持连接intSO_LINGER 延迟关闭连接struct lingerSO_OOBINLINE带外数据放入正常数据流intSO_RCVBUF 接收缓冲区大小intSO_SNDBUF 发送缓冲区大小intSO_RCVLOWAT 接收缓冲区下限intSO_SNDLOWAT 发送缓冲区下限intSO_RCVTIMEO 接收超时struct timevalSO_SNDTIMEO 发送超时struct timevalSO_REUSERADDR 允许重用本地地址和端口intSO_TYPE 获得套接字类型intSO_BSDCOMPAT与BSD系统兼容 int=IPPROTO_IP-IP_HDRINCL在数据包中包含IP首部intIP_OPTINOSIP首部选项intIP_TOS服务类型IP_TTL生存时间int=IPPRO_TCP-TCP_MAXSEGTCP最大数据段的大小 intTCP_NODELAY 不使用Nagle算法 int=返回说明:成功执行时,返回0。失败返回-1,errno被设为以下的某个值EBADF:sock不是有效的文件描述词EFAULT:optval指向的内存并非有效的进程空间EINVAL:在调用setsockopt()时,optlen无效ENOPROTOOPT:指定的协议层不能识别选项ENOTSOCK:sock描述的不是套接字SO_RCVBUF和SO_SNDBUF每个套接口都有一个发送缓冲区和一个接收缓冲区,使用这两个套接口选项可以改变缺省缓冲区大小。/ 接收缓冲区int nRecvBuf=32*1024; /设置为32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int);/发送缓冲区int nSendBuf=32*1024;/设置为32Ksetsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int);注意: 当设置TCP套接口接收缓冲区的大小时,函数调用顺序是很重要的,因为TCP的窗口规模选项是在建立连接时用SYN与对方互换得到的。对于客户,O_RCVBUF选项必须在connect之前设置;对于服务器,SO_RCVBUF选项必须在listen前设置。结合原理说明: 1.每个套接口都有一个发送缓冲区和一个接收缓冲区。 接收缓冲区被TCP和UDP用来将接收到的数据一直保存到由应用进程来读。 TCP:TCP通告另一端的窗口大小。 TCP套接口接收缓冲区不可能溢出,因为对方不允许发出超过所通告窗口大小的数据。 这就是TCP的流量控制,如果对方无视窗口大小而发出了超过窗口大小的数据,则接 收方TCP将丢弃它。 UDP:当接收到的数据报装不进套接口接收缓冲区时,此数据报就被丢弃。UDP是没有流量控制的;快的发送者可以很容易地就淹没慢的接收者,导致接收方的UDP丢弃数据报。 2.我们经常听说tcp协议的三次握手,但三次握手到底是什么,其细节是什么,为什么要这么做呢? 第一次:客户端发送连接请求给服务器,服务器接收; 第二次:服务器返回给客户端一个确认码,附带一个从服务器到客户端的连接请求,客户机接收,确认客户端到服务器的连接. 第三次:客户机返回服务器上次发送请求的确认码,服务器接收,确认服务器到客户端的连接. 我们可以看到: 1. tcp的每个连接都需要确认. 2. 客户端到服务器和服务器到客户端的连接是独立的. 我们再想想tcp协议的特点:连接的,可靠的,全双工的,实际上tcp的三次握手正是为了保证这些特性的实现. 3.setsockopt的用法1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL);2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:BOOL bDontLinger = FALSE;setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL);3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:int nNetTimeout=1000;/1秒/发送时限setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int);/接收时限setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int);4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:/ 接收缓冲区int nRecvBuf=32*1024;/设置为32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int);/发送缓冲区int nSendBuf=32*1024;/设置为32Ksetsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int);5. 如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响程序的性能:int nZero=0;setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero);6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):int nZero=0;setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int);7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:BOOL bBroadcast=TRUE;setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL);8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)BOOL bConditionalAccept=TRUE;setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)&bConditionalAccept,sizeof(BOOL);9.如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们一般采取的措施是从容关闭shutdown(s,SD_BOTH),但是数据是肯定丢失了,如何设置让程序满足具体应用的要求(即让没发完的数据发送出去后在关闭socket)?struct linger u_short l_onoff
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能化老年旅游服务平台建设方案
- 水库枢纽工程水文监测与预警系统方案
- 全球石油减产协议书
- 2026年泡棉胶带、导热胶带的加工生产项目环境影响报告表环评报告
- 买卖钻机合同协议书
- 会计保密协议书范本
- 兽药生产项目风险评估报告
- 交通追尾赔偿协议书
- 中巴疫苗转让协议书
- 2025年辽宁语文考研真题及答案
- 俄罗斯联邦航天活动法
- 外研版小学英语单词表汇总全带音标(一年级起点)
- 清华大学出版社机械制图习题集参考答案(第三版)最全整理PPT通用课件
- GB/T 10752-2005船用钢管对焊接头
- FZ/T 73002-2006针织帽
- 对外汉语教学语言测试课件
- 河床稳定计算及河相分析
- 学术论文写作格式及规范课件
- 2021年上海临港外服人力资源有限公司招聘笔试试题及答案解析
- 平面镜成像 完整版课件
- 等离子体物理课件
评论
0/150
提交评论