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。这些都不适用。