2010-10-05 4 views
0

Je suis le débutant dans la programmation socket. Je veux recevoir des paquets udp en continu depuis le port. Pour cela, j'ai créé socket et en utilisant les appels bind et recv que j'ai fait avec mon programme. Dans un tampon, je stocke les paquets udp. Comment recevoir paquet par paquet. Comment mettre la condition pour un intervalle de temps particulier? Merci d'avance.udp winsock programmation

static int recvData = 1; 
sockID = socket(AF_INET, SOCK_DGRAM, 0); 
if(sockID < 0) 
{ 
    printf("Socket creation error\n"); 
     WSACleanup(); 
} 
else 
{ 
    printf("Socket Created\n"); 
} 

fepAddr.sin_family = AF_INET; 
fepAddr.sin_port = htons(inputData.portNo); 
fepAddr.sin_addr.s_addr = inet_addr(inputData.destIPAddr); 

if (bind(sockID, (struct sockaddr *)&fepAddr, sizeof(fepAddr)) == SOCKET_ERROR) 
{ 
    printf("bind() failed: %ld.\n", WSAGetLastError()); 
    closesocket(sockID); 
    return 0; 
} 

else 
{ 
    printf("bind() is OK!\n"); 
} 

memset(udpBuf,sizeof(udpBuf),0); 
while (recvData) 
{ 
    printf("receiving data\n"); 
    recvResult = recvfrom(sockID, udpBuf, sizeof(udpBuf), 0,(struct sockaddr *)&fepAddr, &sock_len); 


    fprintf(udp, "%s", udpBuf); 
    //fwrite(udpBuf, sizeof(udpBuf), 1, udp); 
    recvData-- ; 
} 
exit: 
    if(udp) 
    { 
     fclose(udp); 
     udp = 0; 
    } 

//shutdown socket 
closesocket(sockID); 
fclose(udp); 

Répondre

1

recvfrom() reçoit les données UDP paquet par paquet. Si un paquet donné est trop volumineux, recvfrom() retournera une erreur. En ce qui concerne le timing, vous pouvez utiliser select() pour savoir quand le socket est lisible.

Essayez quelque chose comme ceci:

sockID = socket(AF_INET, SOCK_DGRAM, 0); 
if (sockID == INVALID_SOCKET) 
{ 
    printf("Socket creation error\n"); 
    goto exit; 
} 

printf("Socket Created\n"); 

memset(&fepAddr, 0, sizeof(fepAddr)); 
fepAddr.sin_family = AF_INET; 
fepAddr.sin_port = htons(inputData.portNo); 
fepAddr.sin_addr.s_addr = inet_addr(inputData.destIPAddr); 

if (bind(sockID, (struct sockaddr *)&fepAddr, sizeof(fepAddr)) == SOCKET_ERROR) 
{ 
    printf("bind() failed: %ld.\n", WSAGetLastError()); 
    goto exit; 
} 

printf("bind() is OK!\n"); 

memset(udpBuf, 0, sizeof(udpBuf)); 

printf("receiving data\n"); 
while (...) 
{ 
    printf("."); 

    recvResult = recvfrom(sockID, udpBuf, sizeof(udpBuf), 0, (struct sockaddr *)&fepAddr, &addr_len); 
    if (recvResult == SOCKET_ERROR) 
    { 
    if (WSAGetLastError() != WSAEWOULDBLOCK) 
    { 
     printf("\nrecvfrom() failed: %ld.\n", WSAGetLastError()); 
     goto exit; 
    } 

    fd_set fd; 
    FD_ZERO(&fd); 
    FD_SET(sockID, &fd); 

    timeval t; 
    t.tv_sec = ...; // seconds 
    t.tv_usec = ...; // microseconds 

    selectResult = select(0, &fd, NULL, NULL, &t); 
    if (selectResult == SOCKET_ERROR) 
    { 
     printf("\nselect() failed: %ld.\n", WSAGetLastError()); 
     goto exit; 
    } 

    if (selectResult == 0) 
    { 
     printf("\nsocket timed out.\n"); 
     goto exit; 
    } 

    continue; 
    } 

    if (recvResult > 0) 
    fwrite(udpBuf, recvResult, 1, udp); 
} 

exit: 
    if (udp != 0) 
    { 
    fclose(udp); 
    udp = 0; 
    } 

    if (sockID != INVALID_SOCKET) 
    { 
    closesocket(sockID); 
    sockID = INVALID_SOCKET; 
    } 
+0

merci pour votre réponse ...... – ulaga

+0

je besoin de plus d'aide ..... J'ai créé prise à l'aide raw socket (PF_PACKET, SOCK_RAW, ETH_P_IP) .... mais il donne un argument invalide ... comment créer un socket brut pour recevoir des paquets udp du port ?? – ulaga

+0

SOCK_RAW n'est pas disponible dans la famille PF_PACKET. Il est uniquement disponible dans les familles AF_INET et AF_INET6. La liaison –