Server - Client - Daemon Design

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值