Server <-------------------> Client <-------------------> Daemon
1. Client 与 Server 有一条长连接, 负责获得server发送的cmd, 转发Daemon的response.
2. Client 与 Daemon之间有一条local socket session, 用于转发server的cmd, 获得Daemon的response.
code的写法都如下:
ret = select() if (ret > 0 && 可读)
{
//recv cmd from server
ret = recv(client_socket, ...);
//transfer cmd to daemon ret = send(local_socket, ...)
//wait response from daemon
ret = recv(local_socket, ...);
//send responce to server
ret = send(client_socket,...);
}
正常case:
server send cmdA1 to Client, Client send cmdA1 to Daemon, Daemon handle cmdA1 and provide response.
可能出问题的case:
1. Client正在send cmdA1 to Daemon, 由于不知何种原因, 发送很慢但是却能发送, 并没有报错。
问题点: 此时server send cmdA2 Fail
Main Thread:
ret = select()
if (ret > 0 && 可读)
{
ret = recv(client_socket, ...);
retry:
ret = add_cmd_into_queue();
if (ret < 0)
{
printf("queue is full");
goto retry;
}
}
Cmd handle thread:
while (1)
{
pthraed_lock();
if (queue is empty)
{
usleep(100000);
}
else
{
ret = send(local_socket, ...);
p = p->next;
}
pthraed_unlock();
}
case2:
Client成功将cmdA1发送给Daemon, 但是Daemon处理的很慢,导致一直收不到response.
问题点:
此时server send cmdA2 Client 无法接收,因为block在recv response
```
解法:
1) daemon在发送response前先告诉client这条response是对应哪个cmd的.
lock();
a) packet1-> CMD_XX_RESPONSE
b) packet2-> Response Data
unlock();
2) client select polling recv()
收到CMD_XX_RESPONSE后必须要成功收到Response Data, 否则认为是bug.