我正在我的 Debian Wheezy(带有实时补丁)上开发一个实时项目,它需要使用 TCP 通信协议的强大反应性。
当我发送请求时,响应时间太长(220us),我不明白为什么。我的问题是当我发送请求时,我的应用程序服务器回答太晚了,无法满足我的需求。
因此,我决定编写一个使用 TCP 套接字的小程序来获取服务器的响应时间。(见下面的代码)
#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);
}
}
我通过以下过程检查响应时间:
- 启动一个wireshark会话来跟踪网络流量
- 启动我的 C 服务器。
- 例如发送一个 TCP 请求:$echo 'abcde'|netcat 192.168.0.1 12345
从发送字符串的那一刻(abcde)到我在套接字上收到响应的那一刻(OK),我得到了大约 200 µs 的响应时间
这个时间似乎很高。我在 VxWorks 上也有同样的体验,响应时间接近 10µs。
Linux内核真的很慢还是有增加系统反应性的技巧?
感谢您的帮助和建议。