Такая проблема:
Создаем сокет и ассоциируем его с файлом. Программа работает в режиме демона. При подключении через телнет выдает нужную инфу и получает комманды, т.е. все нормально. Далее на делфе пишем клиента под винду. В клиенте подключение, отправка комманды и завершение соединения проходит нормально, но если мы открываем соединение, отправляем комманды и после соединение не разрываем, а, например, пытаемся отправить следующую комманду (т.е. остаемся на линии), то ничего не происходит. Зато после закрытия соединения вываливается все, что было в буфере.
Что делать, в чем ошибка?
Нужно сделать flush для сокета. Я не знаю, как это сделать в Delphi. Поищите в Google:Groups.
>Что делать, в чем ошибка?
Выкинуть компонет TClientSocket и работать с соктами напрямую через WinApi
>>Что делать, в чем ошибка?
>Выкинуть компонет TClientSocket и работать с соктами напрямую через WinApiНу к чему же? Давайте вообще Delphi выкинем... а?
>>>Что делать, в чем ошибка?
>>Выкинуть компонет TClientSocket и работать с соктами напрямую через WinApi
>
>Ну к чему же? Давайте вообще Delphi выкинем... а?тык, давно пора.. как классовый элемент :)
// wbr
>>>>Что делать, в чем ошибка?
>>>Выкинуть компонет TClientSocket и работать с соктами напрямую через WinApi
>>
>>Ну к чему же? Давайте вообще Delphi выкинем... а?
>
>тык, давно пора.. как классовый элемент :)
>
>// wbr
хм... вообще то я как раз через Win Api и работаю.... =))
Как мы следим за ходом работы ? Я так подозреваю, сервер вываливает на экран команды ?
Стойкой подозрение на буферизацию вывода. То есть, на самом деле оно всё работает, но видишь ты это только после того, как заполнишь буфер экрана и он сбросится (порядка 2к текста кажись).Простейшее решение - в сервере добавлять к выводу каждой строки \n
>Как мы следим за ходом работы ? Я так подозреваю, сервер вываливает
>на экран команды ?
>Стойкой подозрение на буферизацию вывода. То есть, на самом деле оно всё
>работает, но видишь ты это только после того, как заполнишь буфер
>экрана и он сбросится (порядка 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;
}
Фиг его знает. Если верить ману на puts, то она автоматом добавляет \n после вывдоа данных. Должно работать. Может действительно на стороне win буферизация идет ?Между прочим, конструкция "buffer[strlen(buffer)-2]=0;" потенциально опасна - strlen может выбраться за границы буфера и получишь "segmentation fault". И bzero лучше использовать перед заполнение буфера, а не в конце цикла.
PS. Кстати, а не пробовал работать непосредственно с сокетом, а не с его производной на fp ?
>Фиг его знает. Если верить ману на puts, то она автоматом добавляет
>\n после вывдоа данных. Должно работать. Может действительно на стороне win
>буферизация идет ?
>
>Между прочим, конструкция "buffer[strlen(buffer)-2]=0;" потенциально опасна - strlen может выбраться за границы
>буфера и получишь "segmentation fault". И bzero лучше использовать перед заполнение
>буфера, а не в конце цикла.
>
>PS. Кстати, а не пробовал работать непосредственно с сокетом, а не с
>его производной на fp ?
Пробовал, такая же фигня, блин....
А зачем заморачивать на этой системной дряни? Почему бы не взять написаный движок какой-то .. например ACE+TAO (Corba)...
>А зачем заморачивать на этой системной дряни? Почему бы не взять написаный
>движок какой-то .. например ACE+TAO (Corba)...Я в этом не разбираюсь... :-(
Есть классная книжка - ACE+TAO development. Очень дельная вещь, кроссплатформенная, нет заморочек с такими низкоуровнемы операциями как socket и т.п. (может быть нам вернуться к ассемблеру?:)) .. а главное - раз два и готов мощный сервер, понятный, легкий для сопровождения! Почитай так же о CORBA, IDL и т.п. Исходники открыты, куча документации, mailing листы.Сейчас такие системы широко распространены! Советую.
Главное через телнет все работает хорошо...
Проследи каким-нибудь iptraf-ом протекание процесса. Если пакеты с win-клиента приходят в момент их передачи, то проблема на сервере. Если они приходят в момент завершения соединения, то проблема в клиенте.