1

我想知道是否有办法清理窗口套接字内部缓冲区,因为我想要实现的是这个

while(1){
 for(i=0;i<10;i++){
    sendto(...) //send 10 UDP datagrams
 }
 for(i=0;i<10;i++){
    recvfrom (Socket, RecBuf, MAX_PKT_SIZE, 0,
                   (SOCKADDR*) NULL, NULL);
    int Status = ProcessBuffer(RecBuf);
    if (Status == SomeCondition)
        MagicalSocketCleanUP(Socket); //clean up the rest of stuff in the socket, so that it doesn't effect the reading for next iteration of the outer while loop
        break; //occasionally the the receive loop needs to terminate before finishing off all 10 iteration
 }
} 

所以我问是否有一个功能可以清理套接字中剩余的任何东西,这样它就不会影响我的下一次阅读?谢谢

4

1 回答 1

1

从内部接收套接字缓冲区中清理数据的方法是读取数据,直到没有更多数据可读取。如果以非阻塞方式执行此操作,则无需在 中等待更多数据select(),因为EWOUDBLOCK错误值意味着内部接收套接字缓冲区为空。

int MagicalSocketCleanUP(SOCKET Socket) {
    int r;
    std::vector<char> buf(128*1024);
    do {
        r = recv(Socket, &buf[0], buf.size(), MSG_DONTWAIT);
        if (r < 0 && errno == EINTR) continue;
    } while (r > 0);
    if (r < 0 && errno != EWOULDBLOCK) {
        perror(__func__);
        //... code to handle unexpected error
    }
    return r;
}

但这并不完全安全。套接字的另一端也可能已经向套接字缓冲区发送了良好的数据,因此该例程可能丢弃的数据比您要丢弃的数据多。

相反,套接字上的数据应该以您知道感兴趣的数据何时到达的方式构建。ProcessBuffer()因此,您可以扩展以丢弃输入,直到找到感兴趣的数据,而不是清理 API 。

更简单的机制是套接字两侧之间的消息交换。当进入错误状态时,发送者发送“DISCARDING UNTIL <TOKEN>”消息。接收方发回“ <TOKEN>”并知道只有“ <TOKEN>”消息之后的数据会被处理。“ <TOKEN>”可以是随机序列。

于 2013-04-12T21:08:08.383 回答