Socket参数用法

Socket的简单数据传递 数据传递有很多种方式,socket是其中一种,由于socket是一种很基础的平台,所以在大多数系统中都可以使用,所以对于初学者而言,学习socket的数据传递是很有必要的。软件我用的是vs2010,当然现在都有2017了,2017确实多了很多功能,界面也更加友好。   下面直接贴代码:    首先是客户端的代码:             Socket socket;//定义socket 阅读详情

Socket有以下几个选项:

n TCP_NODELAY:表示立即发送数据。

n SO_RESUSEADDR:表示是否允许重用Socket所绑定的本地地址。

n SO_TIMEOUT:表示接收数据时的等待超时时间。

n SO_LINGER:表示当执行Socket的close()方法时,是否立即关闭底层的Socket。

n SO_SNFBUF:表示发送数据的缓冲区的大小。

n SO_RCVBUF:表示接收数据的缓冲区的大小。

n SO_KEEPALIVE:表示对于长时间处于空闲状态的Socket,是否要自动把它关闭。

n OOBINLINE:表示是否支持发送一个字节的TCP紧急数据。

1. TCP_NODELAY选项

1) 设置该选项:public void setTcpNoDelay(boolean on) throws SocketException

2) 读取该选项:public boolean getTcpNoDelay() throws SocketException

3) TCP_NODEALY的默认值为false,表示采用Negale算法。如果调用setTcpNoDelay(true)方法,就会关闭Socket的缓冲,确保数据及时发送:

if(!socket.getTcpNoDelay()) socket.setTcpNoDelay(true);

4) 如果Socket的底层实现不支持TCP_NODELAY选项,那么getTcpNoDelay()和setTcpNoDelay()方法会抛出SocketException。

2. SO_RESUSEADDR选项

1) 设置该选项:public void setResuseAddress(boolean on) throws SocketException

2) 读取该选项:public boolean getResuseAddress() throws SocketException

3) 为了确保一个进程关闭了Socket后,即使它还没释放端口,同一个主机上的其他进程还可以立刻重用该端口,可以调用Socket的setResuseAddress(true)方法:

if(!socket.getResuseAddress()) socket.setResuseAddress(true);

4) 值得注意的是socket.setResuseAddress(true)方法必须在Socket还没有绑定到一个本地端口之前调用,否则执行socket.setResuseAddress(true)方法无效。因此必须按照以下方式创建Socket对象,然后再连接远程服务器:

Socket socket = new Socket(); //此时Socket对象未绑定到本地端口,并且未连接远程服务器

socket.setResuseAddress(true);

SocketAddress remoteAddr = new InetSocketAddress("remotehost",8000);

socket.connect(remoteAddr); //连接远程服务器,并且绑定匿名的本地端口

或者:

Socket socket = new Socket(); //此时Socket对象未绑定到本地端口,并且未连接远程服务器

socket.setResuseAddress(true);

SocketAddress localAddr = new InetSocketAddress("localhost",9000);

SocketAddress remoteAddr = new InetSocketAddress("remotehost",8000);

socket.bind(localAddr); //与本地端口绑定

socket.connect(remoteAddr); //连接远程服务器,并且绑定匿名的本地端口

3. SO_TIMEOUT选项

1) 设置该选项:public void setSoTimeout(int milliseconds) throws SocketException

2) 读取该选项:public int getSoTimeOut() throws SocketException

3) 当通过Socket的输入流读数据时,如果还没有数据,就会等待。Socket类的SO_TIMEOUT选项用于设定接收数据的等待超时时间,单位为毫秒,它的默认值为0,表示会无限等待,永远不会超时。

4) Socket的setSoTimeout()方法必须在接收数据之前执行才有效。此外,当输入流的read()方法抛出SocketTimeoutException后,Socket仍然是连接的,可以尝试再次读取数据。

4. SO_LINGER选项

1) 设置该选项:public void setSoLinger(boolean on, int seconds) throws SocketException

2) 读取该选项:public int getSoLinger() throws SocketException

3) SO_LINGER选项用来控制Socket关闭时的行为。

l socket.setSoLinger(true,0):执行Socket的close()方法时,该方法也会立即返回,但底层的Socket也会立即关闭,所有未发送完的剩余数据被丢弃。

l socket.setSoLinger(true,3600):执行Socket的close()方法时,该方法不会立即返回,而进入阻塞状态,同时,底层的Socket会尝试发送剩余的数据。只有满足以下两个条件之一,close()方法才返回:

n 底层的Socket已经发送完所有的剩余数据。

n 尽管底层的Socket还没有发送完所有的剩余数据,但已经阻塞了3600秒。close()方法的阻塞时间超过3600秒,也会返回,剩余未发送的数据被丢弃。

以上两种情况内,当close()方法返回后,底层的Socket会被关闭,断开连接。

4) setSoLinger(boolean on ,int second)方法中的seconds参数以秒为单位,而不是以毫秒为单位。

5. SO_RCVBUF选项

1) 设置该选项:public void setReceiveBufferSize(int size) throws SocketException

2) 读取该选项:public int getReceiveBufferSize() throws SocketException

3) SO_RCVBUF表示Socket的用于输入数据的缓冲区的大小。

4) 如果底层Socket不支持SO_RCVBUF选项,那么setReceiveBufferSize()方法会抛出SocketException。

6. SO_SNDBUF选项

1) 设置该选项:public void setSendBufferSize(int size) throws SocketException

2) 读取该选项:public int getSendBufferSize() throws SocketException

3) SO_SNDBUF表示Socket的用于输出数据的缓冲区的大小。

4) 如果底层Socket不支持SO_SNDBUF选项,setSendBufferSize()方法会抛出SocketException。

7. SO_KEEPALIVE选项

1) 设置该选项:public void setKeepAlive(boolean on) throws SocketException

2) 读取该选项:public int getKeepAlive() throws SocketException

3) 当SO_KEEPALIVE选项为true,表示底层的TCP实现会监视该连接是否有效。

4) SO_KEEPALIVE选项的默认值为false,表示TCP不会监视连接是否有效,不活动的客户端可能会永久存在下去,而不会注意到服务器已经崩溃。

8. OOBINLINE选项

1) 设置该选项:public void setOOBInline(int size) throws SocketException

2) 读取该选项:public int getOOBInline () throws SocketException

3) 当OOBINLINE为true时,表示支持发送一个字节的TCP紧急数据。Socket类的sendUrgentDate(int data)方法用于发送一个字节的TCP紧急数据。

4) OOBINLINE的默认值为false,在这种情况下,当接收方收到紧急数据时不作任何处理,直接将其丢弃。如果用户希望发送紧急数据,应该把OOBINLINE设为true:socket.setOOBInline(true); 此时接收方会把接收到的紧急数据与普通数据放在同样的队列中。值得注意的是,除非使用一些更高层次的协议,否则接收方处理紧急数据的能力非常有限,当紧急数据到来时,接收方不会得到任何通知,因此接收方很难区分普通数据与紧急数据,只好按照同样的方式处理它们。

9. 服务类型选项

1) IP规定了四种服务类型,用来定性的描述服务的质量:

l 低成本:发送成本低。

l 高可靠性:保证把数据可靠的送达目的地。

l 最高吞吐量:一次可以接收或发送大批量的数据。

l 最小延迟:传输数据的速度快,把数据快速送达目的地。

2) 这四种服务类型还可以进行组合,例如,可以同时要求获得高可靠性和最小延迟。Socket类中提供了设置和读取服务类型的方法:

l 设置服务类型:public void setTrafficClass(int trafficClass) throws SocketException

l 读取服务类型:public int getTrafficClass() throws SocketException

3) Socket类用四个整数表示服务类型:

l 低成本:0x02 (二进制的倒数第二位为1)

l 高可靠性:0x04(二进制的倒数第三位为1)

l 最高吞吐量:0x08(二进制的倒数第四位为1)

l 最小延迟:0x10(二进制的倒数第五位为1)

10. 设定连接时间、延迟和带宽的相对重要性

public void setPerformancePreferences(int connectionTime,int latency,int bandwidth)

以上方法的三个参数表示网络传输数据的三项指标:

n 参数connectionTime:表示用最少时间建立连接。

n 参数latency:表示最小延迟。

n 参数bandwidth:表示最高带宽。

setPerformancePreferences()方法用来设定这三项指标之间的相对重要性。可以为这些参数赋予任意的整数,这些整数之间的相对大小就决定了相应参数的相对重要性。例如,如果参数connectionTime为2,参数latency为1,而参数bandwidth为3,就表示最高带宽最重要,其次是最少连接时间,最后是最小延迟。

深入剖析阻塞式socket的timeout 一个tcp连接建立后,如果一端的物理机突然宕机,另外一端是完全不知情的,它会像往常一样继续发送相关报文,直到超时时间到了才返回。而如果只是进程宕掉,在进程退出的时候,操作会负责回收这个进程所属的所有tcp连接,在这时会向这些tcp连接的对端发送FIN报文,表示要关闭连接了,这时候对端是可以知道连接已经关闭的。在有机器宕机的情况下,如果连接超时时间设置的比较长,而我们客户端的线程池又比较小,就很可能大多数的线程都在等待建立连接,过了较长时间才发现连接不上,影响应用的整体吞吐量。但是可以大致认为是一致的。 阅读详情

相关推荐

opencv3 feature2d 的探索

想研究一下 feature.cpp中的detect() virtual void cv::Feature2D::detect ( InputArray image, std::vector< KeyPoint > & keypoints, ...

slzlincent的博客 1345

Socket参数用法(1)

Socket有以下几个选项: n TCP_NODELAY:表示立即发送数据。 n SO_RESUSEADDR:表示是否允许重用Socket所绑定的本地地址。 n SO_TIMEOUT:表示接收数据时的等待超时时间。 n SO_LINGER:表示当执行Socket的

xhh198781的专栏 3824

保姆级教程:IAR for STM8 3.11版本安装与破解全流程(附资源包)

本文提供IAR for STM8 3.11版本的详细安装与破解教程,涵盖环境准备、主程序安装、许可配置及实战验证全流程。针对新手常见问题,如许可证报错、驱动安装失败等,给出了具体解决方案,帮助开发者快速搭建稳定的STM8开发环境。

study的专栏 956

【计算机网络】Socket的SO_TIMEOUT与连接超时时间

SO_TIMEOUT选项是Socket的一个选项,用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间,如果在指定的时间内没有数据可读取,将抛出SocketTimeoutException异常。

morris 7407

BK3296蓝牙音频SoC深度评测:如何用这颗芯片打造超低功耗TWS耳机?

本文深度评测BK3296蓝牙音频SoC在TWS耳机中的应用,重点解析其22nm工艺带来的超低功耗优势(A2DP模式仅2.8mA)和3×3mm封装设计。通过芯片架构分析、双麦降噪调优及开发套件使用指南,为工程师提供打造高性能TWS耳机的完整解决方案,显著提升续航和音频质量。

rice5的博客 659

Mac上除了Homebrew,这几种安装ADB的方法你可能也需要知道(含手动配置避坑)

本文全面解析Mac上五种ADB安装方案,从Homebrew到手动配置,涵盖常见问题解决与环境变量配置。特别针对macOS High Sierra等老旧系统提供专属解法,帮助开发者高效安装Android Debug Bridge(ADB),避免常见陷阱,提升开发效率。

weixin_42546392的博客 322

Socket参数调优

java socket中有很多参数可以选择,这篇博客的目的是沉淀出这些参数的语义和用法,供自己以后查阅。 1、java socket参数选项总览 在JDK1.6中有如下参数选项: 1 public final static int TCP_NODELAY = 0x0001; 2 3 public final static int SO_BINDADDR = 0x0...

每天进步一点点的专栏 1327

2024最新指南:如何用Python批量下载Sentinel-2数据(附避坑清单)

本文提供2024年最新Python批量下载Sentinel-2遥感数据的完整指南,涵盖环境配置、API准备、核心下载流程实现及实战避坑清单。通过智能查询器、断点续传下载器等实用工具,帮助用户高效获取遥感数据,避免常见网络问题和数据完整性验证失败。

silver的专栏 620

Socket 之 revcfrom()参数及用法详解【不断完善中...】

1 第一点要注意:此函数用在UDP通信中; 2 第二点要注意:此函数在UDP的服务器与客户端中参数:struct sockaddr *from用法是不一样的; 2.1 在服务器端中 使用前from是未知的,即定义后,未对其初始化,就给revcfrom使用,当完成recvfrom调用后 from才被赋值,即存储了客户端的ip,此时接收到的from是网络字节序...

Soar_dream的博客 1138

AHB—SRAMC项目(结构图,核心代码、Testbench架构)

文章目录一、AHB_SRAMC项目介绍1.1.AHB总线控制单元(ahb_slv_if.v)1.2.SRAM控制单元(sramc_top.v)1.3.主要的传输路径二、结构框图2.1.AHB_SRAMC结构图(重点)2.2.总线控制单元与SRAM控制单元结构图三、部分核心代码(重点理解)四、SystemVerilog Testbench架构(重点)五、目录结构 一、AHB_SRAMC项目介绍 本项...

Mr.翟的博客 3万+

基于自抗扰控制的虚拟同步发电机二次调频控制研究

摘要:本文针对高比例可再生能源并网导致的电力系统频率稳定性问题,提出基于自抗扰控制(ADRC)的虚拟同步发电机(VSG)二次调频控制策略。通过分析VSG工作原理和传统调频方法的不足,设计了非线性ADRC和线性ADRC两种控制器,详细阐述了参数整定方法。仿真结果表明,该策略能有效消除频率稳态偏差,提升系统抗扰能力,为分布式电源参与电网调频提供了新思路。 关键词:虚拟同步发电机;自抗扰控制;二次调频;频率调节;抗扰能力

huanghm88的专栏 244

linux socket选项,Java Socket 的参数选项解读

Java Socket中有很多参数可以选择,这篇文章的目的是沉淀出这些参数的语义和用法,供自己以后查阅。1、java socket参数选项总览在JDK1.6中有如下参数选项:public final static int TCP_NODELAY = 0x0001;public final static int SO_BINDADDR = 0x000F;public final static int...

weixin_31445091的博客 239

遥感影像道路提取算法——SGCN

用于从高分辨率遥感图像(TGRS)中提取复杂环境中道路的分割深度可分离图卷积网络摘要:高分辨率遥感图像的道路信息在各个领域得到广泛应用,基于深度学习的方法有效地显示了较高的道路提取性能。然而,在高分辨率遥感图像中,检测柏油路封闭或树木覆盖的道路,仍存在一些挑战,限制了提取的准确性:1)道路之间的阶级内差异较大,城市物体,特别是道路和建筑物之间的阶级间差异不明显;2)被树木、阴影和建筑物遮挡的道路难以提取;3)道路缺乏高精度遥感数据集。

littleyy666的博客 3846

关于socket的setsockopt的使用

关于setsockopt的使用 学习python的时候学习到了socket,其中有个setsockopt方法的使用,于是乎整理一下关于这个方法的一些内容。 本节目录 一 功能描述 二 用法(getsockopt\setsockopt) 三 参数及参数详细说明 四 缓冲区 五 setsockopt的用法 一 功能描述 获取或者设置与...

PresleyR的博客 936

2026年江苏省职业院校技能大赛高职组“软件测试”赛项智能体辅助测试参考答案

2026年江苏省职业院校技能大赛高职组“软件测试”赛项智能体辅助测试参考答案

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 1358

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Socket函数用法详解

Linux 中的一切都是文件,每个文件都有一个整数类型的文件描述符;socket 也是一个文件,也有文件描述符。使用 socket() 函数创建套接字以后,返回值就是一个 int 类型的文件描述符。在 Linux 下使用 <sys/socket.h> 头文件中 socket() 函数来创建套接字,原型为:intsocketintdomaininttypeintprotocol功能:为通信创建一个端点,并返回该端点对应的文件描述符,文件描述符的使用原则是最小未分配原则。

creator_Li的博客 2499

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java Socket 参数详解

Java socket参数选项: TCP_NODELAY:  表示立即发送数据 SO_RESUSEADDR:  表示是否允许重用socket所绑定的本地地址 SO_TIMEOUT :  表示接收数据时的等待超时时间 。 单位为毫秒,默认值为0 , 表示永远等待。 SO_LINGER:  表示当执行 socket的close方法的时候,是否立即关闭底层的s

UPUP 1234

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

1128 socket的msdn描述

  socketThe socket function creates a socket that is bound to a specific service provider.SOCKET socket(  int af,  int type,  int protocol);Parametersaf [in] Address family speci

ensungm的专栏 1412

Windows下socket编程

socket 编程 winsocket2 函数库 语法 SOCKET WSAAPI socket( int af, int type, int protocol ); 参数 af地址簇规范 当前支持的值是AF_INET或AF_INET6,它们是IPv4和IPv6的Internet地址系列格式。( The values currently supported are AF_INET ...

qq_37976565的博客 3106

网络小记:SOCKET

SOCKET 1、::ioctlsocket(handle, FIONBIO, &arg) 问:异步和同步是不是用ioctlsocket(s,   FIONBIO,   &ulBlocking);就可以设置。设置成功后recv,send也是异步的?    答:准确的讲不是的.是否同步还是异步看你初使化Socket时就自动生成了.如果你用WSAStartup()初使化,那么就是同步的.如果你用

玉子玉子烧的专栏 675

socket()函数用法详解:创建套接字

socket()函数用法详解:创建套接字 不管是 Windows 还是 Linux,都使用socket() 函数来创建套接字。socket() 在两个平台下的参数是相同的,不同的是返回值。 在《socket是什么》一节中我们讲到了 Windows 和 Linux 在对待 socket 方面的区别。 Linux 中的一切都是文件,每个文件都有一个整数类型的文件描述符;socket 也是一个文件,也有文件描述符。使用 socket() 函数创建套接字以后,返回值就是一个 int 类型的文件描述符。 Wind.

LittleWhite_Ling的博客 1526

浅谈socket网络编程函数参数(一)

每个进程的进程空间里都有一个socket描述符表。套接字描述符表属于一个进程,而socket地址结构位于操作系统的内核缓冲。

m0_67390379的博客 180

【Linux C socket】socket常用参数说明

socket常用参数说明

Loteria的博客 385

Linux网络通信socket编程-------socket函数

功能 socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。 socke函数调用返回一个整型socket描述符,它实际上控制着一块内核缓冲区,而这块缓冲区是分为读缓冲区和写缓冲区,也就是说一个描述符对应两个划分好的缓冲区。如图: 头文件以及原型 # include

weixin_43743711的博客 259

java Socket用法详解

本篇文章观点和例子来自 《Java网络编程精解》, 作者为孙卫琴, 出版社为电子工业出版社。         在客户/服务器通信模式中, 客户端需要主动创建与服务器连接的 Socket(套接字), 服务器端收到了客户端的连接请求, 也会创建与客户连接的 Socket. Socket可看做是通信连接两端的收发器, 服务器与客户端都通过 Socket 来收发数据.   这篇文章

Code-lover's Learning Notes 745
上一篇: socket的标准参数
下一篇: Netty 源码分析之 一 揭开 Bootstrap 神秘的红盖头 (服务器端)
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值