Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
原始套接字绕过tcp/ip头_C_Linux_Sockets_Optimization_Tcp - Fatal编程技术网

原始套接字绕过tcp/ip头

原始套接字绕过tcp/ip头,c,linux,sockets,optimization,tcp,C,Linux,Sockets,Optimization,Tcp,我有两个程序通过同一台计算机上的套接字进行通信。 目前,使用TCP/IP传输160万字节大约需要7秒。 我得快点 如果我改为使用原始套接字,并忽略TCP/IP头,那么这会提高速度吗?我还能做些什么来提高速度吗?SOCKET\u RAW选项是直接复制还是做其他任何事情?尝试使用Unix域套接字。使用“正常”TCP/IP时,1.6MB不应花费7秒钟-当然不是在同一台机器上!这表明您在某些地方有低效的代码。在尝试在网络方面做任何“特别”的事情之前,我会先解决这个问题 编辑:我刚刚在上网本上编写了一个简

我有两个程序通过同一台计算机上的套接字进行通信。 目前,使用TCP/IP传输160万字节大约需要7秒。 我得快点


如果我改为使用原始套接字,并忽略TCP/IP头,那么这会提高速度吗?我还能做些什么来提高速度吗?SOCKET\u RAW选项是直接复制还是做其他任何事情?

尝试使用Unix域套接字。使用“正常”TCP/IP时,1.6MB不应花费7秒钟-当然不是在同一台机器上!这表明您在某些地方有低效的代码。在尝试在网络方面做任何“特别”的事情之前,我会先解决这个问题


编辑:我刚刚在上网本上编写了一个简短的C#程序,它可以在279ms内传输2MB(生成随机数据)。这是没有优化的。除非您是在20世纪80年代的机器上运行,否则您肯定会获得比这更好的性能…

不,使用原始IP套接字绝对不是一个好主意。使用unix域套接字可能稍微更有效一些,但我怀疑它能否解决您的问题。你显然还有另一个问题。也许是您的应用程序级协议效率低下?

为了获得如此低的性能,您正在做一些非常低效的事情。也许i/o操作是单字节的

更改为原始套接字是个坏主意。为了获得可靠的通信,您必须添加某种数据检查、排序等:TCP为可靠性所做的一切


如果目的是将数据从一个进程传输到同一台机器上的另一个进程,请使用共享内存和互斥来同步访问。当然,如果程序最终必须在不同的机器上运行,这不是一个好的解决方案。

您知道,我最初将其理解为1.6GB而不是MB。你说得很对——1.6MB的7秒意味着有东西坏了,不是TCP。是的。。。听起来像是“选择不坏”的例子谢谢。我发现了这个问题。@eat_a_lemon:在这一点上,解释(无论是在自我回答中还是在问题中)来帮助可能有相同问题的其他人通常是一种很好的方式。你能确认你说的传输一兆字节半需要七秒钟吗?比如说,一张软盘值多少数据?是的,它是1.6MB。我正在调查到底发生了什么。将块大小除以二没有任何好处(也可能有一些缺点)。只要始终尝试recv(),只要缓冲区中有足够的空间就可以接收多少字节(或者剩余的数据字节数,以较小的为准)。(可能是“除以二”机制导致代码在接近传输结束时每次recv()1字节,这肯定会减慢速度)