【问题标题】:Non-blocking socket receive非阻塞套接字接收
【发布时间】:2018-04-17 12:44:20
【问题描述】:

我有一个简单的服务器程序,如下所示:

// create, bind, listen accept etc..

while(1)
{
    UpdateData();
    int ret = send(sock, data, dataLength , 0);

    // Check if client sent "Abort" and if so, break.
}

是否可以不阻塞地检查是否有数据从客户端到达,以便服务器可以不断向客户端转储数据?

【问题讨论】:

标签: c sockets


【解决方案1】:

是的,当然,有很多解决方案,AFAIK:

并非全部适用于所有操作系统。

【讨论】:

  • 谢谢。我最先知道的两个,其余的我必须阅读。
【解决方案2】:

如果你要定义一个非阻塞socket,你应该在打开套接字时在socket-type参数中添加SOCK_NONBLOCK值。例如此语句打开一个RAW 套接字,其中可以在非阻塞模式下读写TCP 数据包:

recv_socket = socket(AF_INET, SOCK_RAW | SOCK_NONBLOCK
                         , IPPROTO_TCP);

然后你可以调用read函数如下:

typedef struct
{
    struct iphdr ip;
    struct tcphdr tcp;
    char datagram[DATAGRAM_SIZE];
} TCP_PACKET;

int ret_read = 0;
TCP_PACKET recv_packet;

ret_read = read(recv_socket, reinterpret_cast<void*>(&received_packet)
, sizeof(received_packet));

if(ret_read >= 0)
{
    // read occured in success
}

注意:不要在read 中使用 const-size:

ret_read = read(recv_socket, reinterpret_cast<void*>(&received_packet)
, 65536);    // makes segmentation fault

它在读取数据包时导致分段错误。只需使用sizeof

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2013-06-03
    相关资源
    最近更新 更多