我有一个使用 TCP 从设备读取数据包的应用程序。我想知道我的接收方应用程序是否使用 TCP_NODELAY 选项创建套接字,设备会自动开始发送数据包而不缓冲它们,还是我必须在发送方(设备)上进行此更改?
最佳答案
设置 TCP_NODELAY 只影响发送的时间。它对传入的信息没有影响。
但是,我应该指出,大多数认为出于某种原因需要设置 TCP_NODELAY 的人都在做错误的事情。除非您无法控制协议(protocol)并且该协议(protocol)并非设计用于 TCP,否则使用 TCP_NODELAY 可能是错误的做法。 TCP_NODELAY 与 keepalive 一样,存在的目的是让并非设计为在 TCP 上工作的协议(protocol)能够稍微不那么糟糕地工作。如果这不能描述您的情况,那么这是错误的解决方案。
关于接收方的 Linux TCP_NODELAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20580385/
围棋之旅:https://tour.golang.org/methods/9packagemainimport("fmt""math")typeAbserinterface{Abs()float64}funcmain(){varaAbserf:=MyFloat(-math.Sqrt2)v:=Vertex{3,4}a=f//aMyFloatimplementsAbsera=&v//a*VerteximplementsAbser//Inthefollowingline,visaVertex(not*Vertex)//anddoesNOTimplementAbser.a=vfmt.Print
这是一个使用函数数组的小例子。我想将其转换为一组接收方方法。第11行数组的正确声明是什么?https://play.golang.org/p/G62Cxm-OG2函数声明将从:funcaddToStock(s*Stock,addint)致:func(s*Stock)addToStock(添加整数) 最佳答案 你可以这样做:packagemainimport("fmt")typeStockstruct{qtyint}varupdaters=[2]func(*Stock,int){func(s*Stock,iint){s.add(i)}
我正在尝试使用以下方法关闭BSD套接字的Nagle算法:setsockopt(newSock,IPPROTO_TCP,TCP_NODELAY,(char*)&flag,sizeofflag);但编译器声称TCP_NODELAY之前从未见过:error:`TCP_NODELAY'undeclared(firstusethisfunction)这是包含文件的完整列表:#include#include#include#include#include#include#includeusingnamespacestd;我还有-lnsl和-lsocket链接器选项,但它无法编译。我错过了什么吗?所
我试图通过在设置后回读它来验证我的TCP_NODELAY设置是否有效。我将值设置为“1”,但当我读回它时,它设置为“4”。恐怕我做错了什么。这是我的代码:inttcpBefore;socklen_ttcpBeforeLen=sizeof(tcpBefore);intres=getsockopt(socket,IPPROTO_TCP,TCP_NODELAY,&tcpBefore,&tcpBeforeLen);//TurnonTCPnodelayinttcpNoDelay=1;res=setsockopt(socket,IPPROTO_TCP,TCP_NODELAY,(void*)&tcp
参数说明你的数据传输并不需要总是准确地遵守某一选项或者其它选择。在那种情况下,你可能想要采取更为灵活的措施来控制网络连接:在发送一系列当作单一消息的数据之前设置TCP_CORK,而且在发送应立即发出的短消息之前设置TCP_NODELAY。如果需要提供网络的传输效率,应该减少小包的传输,使用TCP_CORK来做汇总传输,在利用sendfile来提高效率;但如果是交互性的业务,那应该让任意小包可以快速传输,关闭Nagle算法,提高包的传输效率。TCP_CORK优化了传输的bits效率,tcp_nodelay优化了传输的packet效率。语法:tcp_nodelayon|off;默认值:tcp_no
我需要在python的套接字接收方法上设置超时。怎么做? 最佳答案 典型的方法是使用select()等待直到数据可用或直到发生超时。只有在数据实际可用时才调用recv()。为了安全起见,我们还将套接字设置为非阻塞模式,以保证recv()永远不会无限期地阻塞。select()也可用于一次等待多个套接字。importselectmysocket.setblocking(0)ready=select.select([mysocket],[],[],timeout_in_seconds)ifready[0]:data=mysocket.re
TCP段如何知道该段需要发送到哪个端口号。 最佳答案 如果我正确理解你的问题,那么事情就很简单了。收件人的端口号以及发送主机的端口号在最开始作为TCPheader的一部分写入。您以前见过TCPheader吗?看看下面的图片。任何TCPheader的第一件事都是发送方和接收方的源端口和目标端口。如果您要问的是目标端口号最初是如何到达那里的,那么该问题的答案就是发送主机将它放在那里。这意味着发送主机必须事先知道接收进程正在监听的端口。例如,就Web而言,您的浏览器知道所有使用非安全HTTP的Web服务器都在端口80上监听。因此,它会自动
如何为下面给定的代码设置tcp.nodelay:URLurl=newURL(urlText);HttpURLConnectionconn=(HttpURLConnection)url.openConnection(); 最佳答案 据我所知,您不能在`HttpURLConnection'上设置tcp.noDelay,因为这不允许任何接口(interface)更改底层tcp套接字。我可以推荐的是尝试使用Apachehttpclient因为它提供了设置多个TCP选项的机制。看看这个DefaultHttpClient
RFC793指出,在接收方,传入的段在进行以下检查时被接受:Thefirstpartofthistestcheckstoseeifthebeginningofthesegmentfallsinthewindow,thesecondpartofthetestcheckstoseeiftheendofthesegmentfallsinthewindow;ifthesegmentpasseseitherpartofthetestitcontainsdatainthewindow.但是,可能会出现这样的情况,即段的开头落在窗口中,但段的结尾却没有。这是窗口中仍有空间但段大小比缓冲区中剩余空间长
我正在实现一个简单的代理应用程序,我总是从一端接收数据并发送到另一端。在这种情况下,一旦我确定我已完成接收来自传入分支的所有数据,我是否可以直接调用close()而无需调用shutdown()?如果我这样做,close()是否会确保所有数据都传送到传出线路上的目的地并由目的地的应用程序接收?或者在这种情况下,是否必须在启动关闭之前启动关闭? 最佳答案 canIcalldirectlyclose()withoutcallingshutdown()可以。shutdown仅在您想半关闭连接(即读取或写入结束)时才需要。willtheclo