2013-01-17 54 views
-1

如何使用VC++和WinSock編碼?在套接字上接收,直到在60秒的時間間隔內發送50個字節

Select ? 

Recv(...,...,...,MSG_PEEK) ? 

我只需要算法。

謝謝。

+ 解決

參見TCP以下代碼: -

/* * -2:超時 * -1:套接字錯誤 * 0:連接正常終止 * n:返回的字節數量 */

int timeout_recv (SOCKET sock, char *buf, int *length, int timeoutinseconds) { 

static time_t prevTime = 0; 
time_t currTime; 
DWORD lng = 0,n; 

_ASSERTE(sock != INVALID_SOCKET); 
_ASSERTE(buf); 
_ASSERTE(length); 
_ASSERTE(*length); 

time(&prevTime); 

再次:

if (ioctlsocket(sock, FIONREAD, &lng) == -1 || (n=lng) == 0 || lng < *length) { 

    Sleep(350); 
    time(&currTime); 

    if((currTime - prevTime) > timeoutinseconds) 
     return -2; 
    else 
     goto again; 
} 

if (*length != lng) 
{ 
    _ASSERTE(0); 
    aprintf("we have just received a burst of data, expected %d got %d",*length,lng); 
} 

lng = recv(sock,buf,*length,0); 

if(lng == -1) { 
    aprintf("socket error from recv %d",WSAGetLastError()); 
    return -1; 
} 

if (lng == 0) { 

    aprintf("connection terminated gracefully\n"); 
    return 0; 
} 

return lng; 

}

+0

如果間隔超過,我想結束一切,走出 – user1813004

回答

0

對於超時,請使用以下功能timeout_recvfrom()功能

int timeout_recvfrom (int sock, char *buf, int *length, struct sockaddr_in *connection, int timeoutinseconds) 
{ 
    fd_set socks; 
    struct timeval t; 
    FD_ZERO(&socks); 
    FD_SET(sock, &socks); 
    t.tv_sec = timeoutinseconds; 
    if (select(sock + 1, &socks, NULL, NULL, &t) && 
     recvfrom(sock, buf, *length, 0, (struct sockaddr *)connection, length)!=-1) 
     { 
     return 1; 
     } 
    else 
     return 0; 
} 
+0

謝謝爲非常具體的UDP實現。 – user1813004

+0

TCP怎麼樣? 文檔說recvfrom也適用於流套接字,但其行爲有點不同。 – user1813004

+0

使用'recv'而不是'recvfrom'開發相同的函數。 – MOHAMED

相關問題