实时Linux中的TCP套接字响应时间

实时Linux中的TCP套接字响应时间,c,linux,sockets,tcp,C,Linux,Sockets,Tcp,我正在做一个关于Debian Wheezy(带有实时补丁)的实时项目,它需要使用TCP通信协议进行强烈的反应 当我发送请求时,响应时间太长(220us),我不明白为什么。 我的问题是,当我发送请求时,我的应用程序服务器对我的需求的响应太晚 因此,我决定使用TCP套接字编写一个短程序来获取服务器的响应时间。(见下面的代码) #包括 #包括 #包括 #包括 #包括 #包括 int main(int argc,char*argv[]) { char sendBuffer[]=“确定”; 字符缓冲区[1

我正在做一个关于Debian Wheezy(带有实时补丁)的实时项目,它需要使用TCP通信协议进行强烈的反应

当我发送请求时,响应时间太长(220us),我不明白为什么。 我的问题是,当我发送请求时,我的应用程序服务器对我的需求的响应太晚

因此,我决定使用TCP套接字编写一个短程序来获取服务器的响应时间。(见下面的代码)

#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char sendBuffer[]=“确定”;
字符缓冲区[10];
int socket1;
int工作插座;
索克伦;
int节点长度=1;
sa1中的结构sockaddr_;
结构sockaddr sa2;
socket1=0;
工作套接字=0;
len=sizeof(sa1);
memset(&sa1,0,len);
sa1.sin_addr.s_addr=htonl(不适用于任何情况);
sa1.sin_family=AF_INET;
sa1.sin_端口=htons(12345);
socket1=socket(AF_INET,SOCK_STREAM,0);
绑定(socket1,(结构sockaddr*)和sa1,len);
听(短袜1,10);
workingSocket=accept(socket1、&sa2、&len);
setsockopt(工作套接字、IPPROTO_TCP、TCP_节点延迟和节点延迟、大小(节点延迟));
//收发信息
而(1)
{
recv(工作插座、缓冲器、5、消息等);
发送(工作套接字,发送缓冲区,2,0);
}
}
我通过以下步骤检查响应时间:

  • 启动wireshark会话以跟踪网络流量
  • 启动我的C服务器
  • 发送TCP请求,例如:$echo'abcde'| netcat 192.168.0.1 12345
从发送字符串(abcde)到在套接字上收到响应(OK)之间,我得到了大约200µs的响应时间

这一次似乎很高。我在VxWorks上也有同样的体验,得到了大约10µs的响应时间

Linux内核真的很慢吗?还是有增加系统反应性的技巧


感谢您的帮助和建议。

您可以提高进程优先级,但Linux并不是真正的实时内核,所以像VxWorks这样的内核总是会有更高的响应速度。您有一台服务器可以在10秒内响应吗?给人印象深刻的10G LAN?请注意,如果您希望在Linux下获得保证(硬实时)响应,您可以调查Xenomai(www.Xenomai.org)。“这不是小事,但确实有效。”JoachimPileborg目前,我的流程处于高优先级(高于所有其他流程)。我做了一些不同优先级的测试,结果是一样的。@MartinJames-Only 1GB LAN.)
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/tcp.h>

int main(int argc, char* argv[])
{
    char sendBuffer [] = "OK";
    char buffer [10];
    int socket1;
    int workingSocket;
    socklen_t len;

    int nodelay = 1;

    struct sockaddr_in sa1;
    struct sockaddr sa2;
    socket1 = 0;
    workingSocket = 0;

    len = sizeof(sa1);
    memset(&sa1, 0, len);

    sa1.sin_addr.s_addr = htonl (INADDR_ANY);
    sa1.sin_family = AF_INET;
    sa1.sin_port = htons(12345);

    socket1 = socket(AF_INET, SOCK_STREAM, 0);

    bind(socket1, (struct sockaddr *)&sa1, len);

    listen(socket1, 10);

    workingSocket = accept(socket1, &sa2, &len);

    setsockopt (workingSocket, IPPROTO_TCP, TCP_NODELAY, &nodelay, sizeof(nodelay));

    // receive and send message back
    while (1)
    {
        recv(workingSocket, buffer, 5, MSG_WAITALL);

        send(workingSocket, sendBuffer, 2, 0);
    }
}