6

これまで、私のグーグル検索とmsdnのチェックアウトは、Microsoft Windowsがソケット送信バッファ内の未送信データの量を見つけるために TIOCOUTQ / SIOCOUTQ に相当するものを提供していないことを示唆しています。良いハックが別の何かを発見し、ここに投稿できれば、とても役に立ちます。次のコードをクロスプラットフォームにすることができます

int net_get_unsent (const int sockfd, unsigned long &sock_bytes_unsent )
{

/*  Queries how much data sent on sockfd, 
 *  may not have yet been recieved by the reciever
 * 
 *  returns more than 1 if there's unsent data,
 *  and fills in the amount of unsent data in sock_bytes_unsent
 * 
 * returns 0 if all the data has been sent
 * 
 * returns < 0 if there was a socket I/O error 
 * */

    int err = 0;
    int wsaerr = 0;

    if (sockfd <= 0)
        return -1;

#ifdef WINDOWS
    err = ioctlsocket(sockfd, SIOCOUTQ , &sock_bytes_unsent);

#else
    err = ioctl(sockfd, TIOCOUTQ, &sock_bytes_unsent);

#endif
    if (err < 0) {

#ifdef WINDOWS  
        wsaerr = WSAGetLastError();
#else
        wsaerr = errno;
#endif      
        printf("failed to get unsent data error:%d", wsaerr );
        sock_bytes_unsent = 0;
        return -1 * wsaerr;

    } else if (sock_bytes_unsent > 0 ) {
        printf( "unsent data: %lu bytes", sock_bytes_unsent );
        return 1;
    }

    return err;
}
4

2 に答える 2

1

私の知る限り、Windowsにはそのような呼び出しはありません。(非常にうまく機能するので残念です!)

ただし、次のリンクは非常に便利であり、問​​題の解決に役立つ場合があります。概念は、 「他に何ができるか」で言及されているSIOCOUTQの部分を除いて、すべてのOSに適用されます。セクション。

究極のso_lingerページまたは私のtcpが信頼できない理由

于 2013-01-18T04:43:44.290 に答える