URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3689
[ Назад ]

Исходное сообщение
"Проблема с сокетом"

Отправлено maxval , 06-Дек-04 11:19 
Такая проблема:
Создаем сокет и ассоциируем его с файлом. Программа работает в режиме демона. При подключении через телнет выдает нужную инфу и получает комманды, т.е. все нормально. Далее на делфе пишем клиента под винду. В клиенте подключение, отправка комманды и завершение соединения проходит нормально, но если мы открываем соединение, отправляем комманды и после соединение не разрываем, а, например, пытаемся отправить следующую комманду (т.е. остаемся на линии), то ничего не происходит. Зато после закрытия соединения вываливается все, что было в буфере.
Что делать, в чем ошибка?

Содержание

Сообщения в этом обсуждении
"Проблема с сокетом"
Отправлено Vladislav Lazarenko , 06-Дек-04 12:32 
Нужно сделать flush для сокета. Я не знаю, как это сделать в Delphi. Поищите в Google:Groups.



"Проблема с сокетом"
Отправлено Barlone , 06-Дек-04 12:48 
>Что делать, в чем ошибка?
Выкинуть компонет TClientSocket и работать с соктами напрямую через WinApi

"Проблема с сокетом"
Отправлено Vladislav Lazarenko , 06-Дек-04 12:50 
>>Что делать, в чем ошибка?
>Выкинуть компонет TClientSocket и работать с соктами напрямую через WinApi

Ну к чему же? Давайте вообще Delphi выкинем... а?


"Проблема с сокетом"
Отправлено klalafuda , 06-Дек-04 13:08 
>>>Что делать, в чем ошибка?
>>Выкинуть компонет TClientSocket и работать с соктами напрямую через WinApi
>
>Ну к чему же? Давайте вообще Delphi выкинем... а?

тык, давно пора.. как классовый элемент :)

// wbr


"Проблема с сокетом"
Отправлено maxval , 06-Дек-04 15:02 
>>>>Что делать, в чем ошибка?
>>>Выкинуть компонет TClientSocket и работать с соктами напрямую через WinApi
>>
>>Ну к чему же? Давайте вообще Delphi выкинем... а?
>
>тык, давно пора.. как классовый элемент :)
>
>// wbr


хм... вообще то я как раз через Win Api и работаю.... =))


"Проблема с сокетом"
Отправлено XMan , 07-Дек-04 21:16 
Как мы следим за ходом работы ? Я так подозреваю, сервер вываливает на экран команды ?
Стойкой подозрение на буферизацию вывода. То есть, на самом деле оно всё работает, но видишь ты это только после того, как заполнишь буфер экрана и он сбросится (порядка 2к текста кажись).

Простейшее решение - в сервере добавлять к выводу каждой строки \n


"Проблема с сокетом"
Отправлено maxval , 09-Дек-04 16:06 
>Как мы следим за ходом работы ? Я так подозреваю, сервер вываливает
>на экран команды ?
>Стойкой подозрение на буферизацию вывода. То есть, на самом деле оно всё
>работает, но видишь ты это только после того, как заполнишь буфер
>экрана и он сбросится (порядка 2к текста кажись).
>
>Простейшее решение - в сервере добавлять к выводу каждой строки \n


Хм... а как отключить буферизацию вывода? Сервер все равно на команды не реагирует...

Вот исходник:

int main(int argv, char **argc)
{
    int res, c,j;
    struct sockaddr_in ssa, csa;
// Make socket
    if ((res = socket (AF_INET, SOCK_STREAM, 0)) == -1) { perror ("Socket call error"); exit (1); }
// Create Addres of node
    ssa.sin_family = AF_INET;
    ssa.sin_addr.s_addr = INADDR_ANY;
    ssa.sin_port = htons(1500);
// Connect Socket with Addr
    if (bind (res,(struct sockaddr *)&ssa,sizeof(ssa)) == -1) { perror ("Bind call error"); exit (1); }
    if (listen (res, 5) == -1) { perror ("Listen call error"); exit (1); }
    while(1)
    {
    socklen_t addrlen=sizeof(csa);    
    if ((c = accept (res,(struct sockaddr *)&csa,&addrlen)) == -1) { perror ("Accept call error"); exit (1);}

    char *ret,*buffer;
    int i=0;
    FILE *fp;
    buffer=(char*)malloc(1024);
    fp=fdopen(c,"w+");
    while(i!=1 && i!=2 && !feof(fp))
    {
        fprintf(fp,">");
        ret=fgets(buffer,1024,fp);
        buffer[strlen(buffer)-2]=0;
        puts(buffer);
        if(strcasecmp(buffer,"exit")==0) { i=1; fprintf(fp,"Close socket.\n"); }
        else if(strcasecmp(buffer,"shutdown")==0) { i=2; fprintf(fp,"shutdown.\n"); }
        bzero(buffer,1024);
    }
    fclose(fp);
    close(c);
    bzero(buffer,1024);
    if(i==2) exit(1);

    }
return 0;
}


"Проблема с сокетом"
Отправлено XMan , 09-Дек-04 22:53 
Фиг его знает. Если верить ману на puts, то она автоматом добавляет \n после вывдоа данных. Должно работать. Может действительно на стороне win буферизация идет ?

Между прочим, конструкция "buffer[strlen(buffer)-2]=0;" потенциально опасна - strlen может выбраться за границы буфера и получишь "segmentation fault". И bzero лучше использовать перед заполнение буфера, а не в конце цикла.

PS. Кстати, а не пробовал работать непосредственно с сокетом, а не с его производной на fp ?


"Проблема с сокетом"
Отправлено maxval , 10-Дек-04 18:15 
>Фиг его знает. Если верить ману на puts, то она автоматом добавляет
>\n после вывдоа данных. Должно работать. Может действительно на стороне win
>буферизация идет ?
>
>Между прочим, конструкция "buffer[strlen(buffer)-2]=0;" потенциально опасна - strlen может выбраться за границы
>буфера и получишь "segmentation fault". И bzero лучше использовать перед заполнение
>буфера, а не в конце цикла.
>
>PS. Кстати, а не пробовал работать непосредственно с сокетом, а не с
>его производной на fp ?


Пробовал, такая же фигня, блин....


"Проблема с сокетом"
Отправлено Vladislav Lazarenko , 10-Дек-04 18:16 
А зачем заморачивать на этой системной дряни? Почему бы не взять написаный движок какой-то .. например ACE+TAO (Corba)...

"Проблема с сокетом"
Отправлено maxval , 12-Дек-04 11:59 
>А зачем заморачивать на этой системной дряни? Почему бы не взять написаный
>движок какой-то .. например ACE+TAO (Corba)...

Я в этом не разбираюсь... :-(


"Проблема с сокетом"
Отправлено Vladislav Lazarenko , 12-Дек-04 17:18 
Есть классная книжка - ACE+TAO development. Очень дельная вещь, кроссплатформенная, нет заморочек с такими низкоуровнемы операциями как socket и т.п. (может быть нам вернуться к ассемблеру?:)) .. а главное - раз два и готов мощный сервер, понятный, легкий для сопровождения! Почитай так же о CORBA, IDL и т.п. Исходники открыты, куча документации, mailing листы.

Сейчас такие системы широко распространены! Советую.


"Проблема с сокетом"
Отправлено maxval , 10-Дек-04 18:18 
Главное через телнет все работает хорошо...

"Проблема с сокетом"
Отправлено XMan , 10-Дек-04 21:14 
Проследи каким-нибудь iptraf-ом протекание процесса. Если пакеты с win-клиента приходят в момент их передачи, то проблема на сервере. Если они приходят в момент завершения соединения, то проблема в клиенте.