Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Крэш при дисконнекте соккета


Автор: Sergio 26.10.2008, 17:49
Всем привет. Проблема следующая: реализовал клиент/сервер приложение на TCP/IP протоколе. Но когда делаю дисконнект клиент то крэш апликухи происходит.
Вот код:
Код

int winTransfer::TransferConnect(int port, char* IP)
{
    char    szBuffer[1024];
    int        i;
    struct    hostent    *host = NULL;
    char    szServerName[1024];

    FILE *file;
    file = fopen("C:\\TransferConnect_log.txt","w+");
    fprintf(file,"IP: %s\n", IP);

    strcpy(szServerName, IP);

    fprintf(file,"szServerName: %s\n", szServerName);

    // Создание сокета
    this->sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    fprintf(file,"this->sClient: %g\n", this->sClient);

    if (this->sClient == INVALID_SOCKET)
    {
        fprintf(file,"Error: %s\n", "INVALID_SOCKET");
        return 1;
    }
    // Заполнение структуры с адресом сервера и номером порта
    this->server.sin_family = AF_INET;
    this->server.sin_port = htons(27005);
    this->server.sin_addr.s_addr = inet_addr("127.0.0.1");

    // Если указано имя, то перевод символьного адреса сервера в IP
    if (this->server.sin_addr.s_addr == INADDR_NONE)
    {
        host = gethostbyname(szServerName);
        if (host == NULL)
        {
            return 1;
        }
        CopyMemory(&this->server.sin_addr, host->h_addr_list[0], host->h_length);
    }

    // Соединение с сервером
    if (connect(this->sClient, (struct sockaddr *)&this->server, sizeof(this->server)) == SOCKET_ERROR)
    {
        fprintf(file, "IP: %s\n", "SOCKET_ERROR");
        fprintf(file, "this->sClient: %g\n", this->sClient);
        fclose(file);
        return -1;
    }
    else
    {
        fprintf(file,"IP: %s\n", "SOCKET_OK");
        fclose(file);
        return 0;
    }

    fclose(file);
}

Дисконнект клиента:
Код

int winTransfer::TransferDisconnect()
{
    int error = 0;
    // Закрытие сокета после работы с потоком

    error = closesocket(this->sClient);
    this->sClient = NULL;

    if (error != 0)
        return error;
}

Помогите найти ошибку. Спасибо

P.S. Продебажить не могу поскольку этот код в шарпе вызываю

Автор: Sergio 26.10.2008, 18:17
Ошибку нашёл. Неправильно реализован сервер

Автор: J0ker 26.10.2008, 18:45
я вот не понимаю, почему народ так безответственно относится к дисконнекту TCP
наверное 99% сокетов пишутся вот именно так - closesocket и все
а потом спрашивают почему не все данные пришли или почему сокеты висят на серваке в TIME_WAIT

Автор: Олег2005 26.10.2008, 22:32
Цитата(Sergio @  26.10.2008,  17:17 Найти цитируемый пост)
Неправильно реализован сервер 

Что то кода сервера тут вообще не видать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)