C++ 清洁车窗插座内部缓冲器

C++ 清洁车窗插座内部缓冲器,c++,sockets,winsock,msdn,C++,Sockets,Winsock,Msdn,我想知道是否有办法清理窗口套接字内部缓冲区,因为我想实现的是 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 = ProcessBuffe

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

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
 }
} 
while(1){

对于(i=0;i从内部接收套接字缓冲区清除数据的方法是读取数据,直到没有更多数据可读取。如果以非阻塞方式执行此操作,则无需在
select()
中等待更多数据,因为
ewoodblock
错误值表示内部接收套接字缓冲区为空

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;
}
int MagicalSocketCleanUP(套接字){
INTR;
std::向量buf(128*1024);
做{
r=recv(套接字,&buf[0],buf.size(),MSG_DONTWAIT);
如果(r<0&&errno==EINTR)继续;
}而(r>0);
if(r<0&&errno!=ewooldblock){
perror(函数);
//…处理意外错误的代码
}
返回r;
}
但这并不完全安全。套接字的另一端可能也向套接字缓冲区发送了良好的数据,因此此例程可能会丢弃比您想要丢弃的更多的数据

相反,套接字上的数据应该以这样一种方式进行框接,即您知道感兴趣的数据何时到达。因此,您可以扩展
ProcessBuffer()
以丢弃输入,直到它找到感兴趣的数据


一种更简单的机制是套接字两侧之间的消息交换。当进入错误状态时,发送方发送一条“丢弃直到<代码>
”消息。接收方发回“
”,并且知道只有“
”消息之后的数据才会被处理可以是随机序列。

从内部接收套接字缓冲区清除数据的方法是读取数据,直到没有更多数据可读取。如果以非阻塞方式执行此操作,则无需在
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;
}
int MagicalSocketCleanUP(套接字){
INTR;
std::向量buf(128*1024);
做{
r=recv(套接字,&buf[0],buf.size(),MSG_DONTWAIT);
如果(r<0&&errno==EINTR)继续;
}而(r>0);
if(r<0&&errno!=ewooldblock){
perror(函数);
//…处理意外错误的代码
}
返回r;
}
但这并不完全安全。套接字的另一端可能也向套接字缓冲区发送了良好的数据,因此此例程可能会丢弃比您想要丢弃的更多的数据

相反,套接字上的数据应该以这样一种方式进行框接,即您知道感兴趣的数据何时到达。因此,您可以扩展
ProcessBuffer()
以丢弃输入,直到它找到感兴趣的数据


一种更简单的机制是套接字两侧之间的消息交换。当进入错误状态时,发送方发送一条“丢弃直到<代码>”消息。接收方发回“
”,并且知道只有“
”消息之后的数据才会被处理可以是一个随机序列。

您可以只
recvfrom()
并丢弃您不想要的数据包?@NPE是的,我可以这样做,但需要调用recvfrom()和select(),但在开始下一轮之前需要更多的时间。更具体地说,每次调用select()需要等待一些我不想承受的时间。Thanks@paulsm4,我不想关闭套接字,因为在下一次迭代中,我想再次使用它。shutdown()close()和No_linger()将非常昂贵,因为我需要在每次迭代中打开一个新的套接字,对吗?请阅读以下内容,shutdown()不会关闭套接字,但即使不再设置接收标志,也会允许传入数据。因此,我猜这不会释放内部缓冲区。@paulsm4不,他不能。这是UDP。这些都不适用。您可以只
recvfrom()
并丢弃您不想要的数据包?@NPE是的,我可以这样做,但这需要调用recvfrom()和select(),但在开始下一轮之前需要更多的时间。更具体地说,每次调用select())需要等待一些我不想承受的时间。Thanks@paulsm4,我不想关闭套接字,因为在下一次迭代中,我想再次使用它。shutdown()close()和No_linger()将非常昂贵,因为我需要在每次迭代中打开一个新的套接字,对吗?请阅读以下内容,shutdown()不会关闭套接字,但即使不再设置接收标志,也会允许传入数据。因此我猜这不会释放内部缓冲区。@paulsm4不,他不能。这是UDP。这些都不适用。