LINUX下TCP程序问题,为何服务端会延迟一会儿收到客户端的数据
linux下的c程序作为服务端,客户端是java程序。
服务端使用非阻塞socket,每隔一秒定时接收一次,客户端每隔5秒发送心跳信息,此外客户端不定时发送指令数据,要求服务端回应此指令。
现在的问题是服务端经常会延迟(远大于1秒)收到客户端的指令,若客户端关闭发送心跳数据,则服务端经常会在客户端第二次发送指令的时候才收到第一次的数据。似乎是后一次发送的数据将前一次的数据由协议层‘挤’到socket层的。
后来我又把socket改为阻塞的,采用线程方式,效果类似,不知道原因在哪里?
代码见下面
服务端socket初始化部分
if (srvsock > 0)
{
shutdown(srvsock, SHUT_RDWR);
close(srvsock);
}
srvsock = socket(AF_INET, SOCK_STREAM, 0);
if (srvsock < 0)
return (BOOLEAN)1; /*log it */
i = fcntl(srvsock, F_SETFL, O_NONBLOCK);
if (i < 0)
{
shutdown(srvsock, SHUT_RDWR);
close(srvsock);
return (BOOLEAN)1; /*log it */
}
k = 1;
v = 1;
i = setsockopt(srvsock, SOL_SOCKET, SO_REUSEADDR, &k, sizeof(int));
if (i < 0)
{
shutdown(srvsock, SHUT_RDWR);
close(srvsock);
return (BOOLEAN)1; /*log it */
}
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons(MTRACE_TCP_PORT);
i = bind(srvsock, (struct sockaddr *)&local, sizeof(local));
if (i < 0)
{
shutdown(srvsock, SHUT_RDWR);
close(srvsock);
return (BOOLEAN)1; /*log it */
}
i = listen(srvsock, MAX_CLIENT_NUM);
if (i < 0)
{
shutdown(srvsock, SHUT_RDWR);
close(srvsock);
return (BOOLEAN)1; /*log it */
}
接收部分
while ((j = recv(sockid, msgbuf, sizeof(msgbuf), 0/*MSG_NOSIGNAL*/)) > 0)
{
/ *process... */
}
if (j == 0) /*peer closed */
{
/* close */
}
else if (j < 0)
{
if (errno != EAGAIN)
{
/* close */
}
}