UDP Tx loop перестает работать каждый раз с ровно 3970 пакетами, 14386 на моем компьютере друзей - PullRequest
0 голосов
/ 02 июля 2011

Я застрял в этой проблеме в течение последних 4 дней, и я не могу понять это. Я пытаюсь отправить данные себе, используя UDP-пакеты, чтобы другая программа могла читать байты.

Я могу четко прочитать пакеты, но я получаю только 3970 до зависания части программы UDP. Переизбыток и все остальное продолжает работать нормально. Я дал своему другу тот же код, и он запустил его на своем компьютере. Он получил 14386 итераций, прежде чем зависает переменная temp будет считать количество отправленных пакетов. -1 плохо. Счетчик считает итерации цикла while. Я следую примеру здесь:

http://msdn.microsoft.com/en-us/library/ms740148(v=vs.85).aspx

Пример кода:

#include "stdafx.h"
#include <WinSock2.h> // don't forget to add in 
//Project Properties>Linker>Input>Additional Dependences [Ws2_32.lib]
sockaddr_in dest;
sockaddr_in local;
WSAData data;
static void SUDP_init(void)
{
    printf("--[UDP Socket Initialized]--\r\n");
    WSAStartup( MAKEWORD( 2, 2 ), &data );

    local.sin_family = AF_INET;
    local.sin_addr.s_addr = inet_addr( "127.0.0.1" ); //same as localhost
    local.sin_port = 6000;

    dest.sin_family = AF_INET;
    dest.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    dest.sin_port = htons( 6000 );

    bind( socket( AF_INET, SOCK_DGRAM, 0 ), (sockaddr *)&local, sizeof(local) );
    printf("Socket Bound...\r\n");
}
static int counter = 0;
int _tmain(int argc, _TCHAR* argv[])
{
    SUDP_init();
    while(1){
        char packet[30];
        sprintf(packet, "%0.3f,%0.3f,%0.3f", 
        55.4,
        16.1,
        -27.88);

        int temp = sendto( socket( AF_INET, SOCK_DGRAM, 0 ), packet, strlen(packet), 0, (sockaddr *)&dest, sizeof(dest) );
        if(temp>=1){
            counter++;
        }
        printf("Bytes Sent: %d, Counter: %d\r\n",temp,counter);
    }
    return 0;
}       

1 Ответ

4 голосов
/ 02 июля 2011

Вы выделяете новые сокеты в цикле (первый аргумент sendto), вы также выделяете другой для bind, но они никогда не освобождаются. В конечном итоге у вас заканчиваются дескрипторы сокетов, и ваша программа зависает.

Вместо этого выделите сокет один раз в SUDP_init, сохраните его вместо того, чтобы выбросить, а затем передайте его bind и sendto

...