Страница 1 из 2

Создание tcp сервера

СообщениеДобавлено: 16.02.2010 12:37:30
Yurakl
Добрый день. Мне необходимо чтобы с одного устройства(компьютера) передавались байты на другой компьютер. Tcp клиент есть, а вот возникла проблема в создании tcp сервера.
Пишу на lazarus под Linux
Код: Выделить всё
   s:=socket(AF_INET, SOCK_STREAM, 0);
    serv_addr.sin_family:= AF_INET;
    serv_addr.sin_addr.s_addr:= INADDR_ANY;
    serv_addr.sin_port:= htons(10001);
    bind(s, serv_addr, sizeof(serv_addr));
    listen(s, 3);

и на данном этапе выводится,что bind=false
Подскажите,пожалуйста

Re: Создание tcp сервера

СообщениеДобавлено: 19.02.2010 09:03:32
Yurakl
никто никогда не реализовывал??

Re: Создание tcp сервера

СообщениеДобавлено: 19.02.2010 10:28:40
скалогрыз
Yurakl писал(а):никто никогда не реализовывал??

очевидно же, что ты первый ;)

http://linux.die.net/man/2/bind

http://linux.die.net/man/2/listen

самая важное, что там написано:

Return Value

On success, zero is returned. On error, -1 is returned, and errno is set appropriately


наверное, следующий логический шаг начинать "принимать" сообщения, используя либо accept либо select?!

Re: Создание tcp сервера

СообщениеДобавлено: 19.02.2010 11:49:40
Yurakl
скалогрыз
accept наверное нужно использовать после того как привязка по bind пройдет

Код: Выделить всё
    s:=socket(AF_INET, SOCK_STREAM, 0);
    port:=10001;
      serv_addr.sin_family:= AF_INET;
      serv_addr.sin_addr.s_addr:= INADDR_ANY;
      serv_addr.sin_port:= htons(port);
      if bind(s, serv_addr, sizeof(serv_addr))=false then writeln(errno);
      if listen(s, 1)=false then writeln(errno);
      razmer_addr:=sizeof(saddr);
      p:=accept(s, saddr, razmer_addr);


C bind скорее всего разберусь, там вроде дело с портом, но далее accept выдает ошибки...

Re: Создание tcp сервера

СообщениеДобавлено: 19.02.2010 11:50:30
скалогрыз
стёр сообщение?!?? :shock:

ну ладно... насчёт переиспользования адреса (может понадобиться кому, 2 сервера поднять на тот же порт): SO_REUSEADDR

http://linux.die.net/man/7/socket

вообще не используй bind() функции, используй fpbind()

Re: Создание tcp сервера

СообщениеДобавлено: 19.02.2010 12:15:55
Yurakl
скалогрыз писал(а):вообще не используй bind() функции, используй fpbind()

а чем fpbind лучше bind?
еще под lazarus в linux есть свои особенности....

Re: Создание tcp сервера

СообщениеДобавлено: 19.02.2010 12:50:26
скалогрыз
а чем fpbind лучше bind?

fp* функции поддерживаются командой разработчиков FPC. можно считать их кросс-платформенными.
я сам не в курсе причин о введении fp* функций, но раз уж разработчики рекомендуют, то почему бы и нет ;)

Re: Создание tcp сервера

СообщениеДобавлено: 19.02.2010 14:14:30
Yurakl
Ну если с Bind вроде разобрался, встает проблема с accept.
Как я понимаю как раз на этой функции происходит непосредственная связь с клиентом. но почему то при запуске клиента, на accept все останавливается.
см. выше код

Re: Создание tcp сервера

СообщениеДобавлено: 19.02.2010 15:48:11
скалогрыз
Yurakl писал(а):Ну если с Bind вроде разобрался, встает проблема с accept.

и в чём же была проблема? неправильный порт?

Yurakl писал(а):Как я понимаю как раз на этой функции происходит непосредственная связь с клиентом. но почему то при запуске клиента, на accept все останавливается.
см. выше код

Accept - блокирует исполнения потока, если сокет находится в блокирующем режиме (как раз, как в коде выше).
Разблокируется только в том случае, если сервер-сокет закрыт, либо присоединился клиент.

если проблема была с портом, то нужно проверить клиентское приложение - туда ли коннектится.

Re: Создание tcp сервера

СообщениеДобавлено: 19.02.2010 16:16:40
Yurakl
все,я решил проблему. Сейчас осталось только сделать, чтобы сервер получал подтверждение переданных байтов и потом переходить к следующему этапу...

Re: Создание tcp сервера

СообщениеДобавлено: 19.02.2010 18:27:07
скалогрыз
Очень продуктивное описание! Людям пригодится твой опыт!

Re: Создание tcp сервера

СообщениеДобавлено: 19.02.2010 18:55:02
Verx0Laz
Yurakl писал(а):все,я решил проблему. Сейчас осталось только сделать, чтобы сервер получал подтверждение переданных байтов и потом переходить к следующему этапу...


А теперь пора подумать о вечном :) Просьба к тебе огромная - помоги фронту, природе и будущим поколениям - выложи упрощенные, но рабочие исходнички клиента и сервера, и желательно с комментариями. Этим ты придашь святости облику своему, а заодно и будущих кодеров на путь истинный наставишь. Но главное - сильно занятые шаманы на подобное подтягиваются гораздо охотнее, и часто при этом подсказывают, что можно красивее реализовать, а где заставить код шуршать быстрее. В общем, дело достаточно богоугодное :)

Re: Создание tcp сервера

СообщениеДобавлено: 24.02.2010 09:40:53
Yurakl
Вот tcp сервер

Код: Выделить всё
s:=socket(AF_INET, SOCK_STREAM, 0);
    port:=10001;
      serv_addr.sin_family:= AF_INET;
      serv_addr.sin_addr.s_addr:= INADDR_ANY;
      serv_addr.sin_port:= htons(port);
      if bind(s, serv_addr, sizeof(serv_addr))=false then writeln(errno);
      if listen(s, 1)=false then writeln(errno);
  ac:=true;
  razmer_addr:=sizeof(saddr);
    while ac do
      begin
      p:=accept(s, saddr, razmer_addr);
     writeln(p);
        if p<0 then writeln(errno);
   while ac do
     begin
   send(p,buf[0],5,MSG_DONTWAIT);
    sleep(2500);
    end;
   closesocket(p);
   end;
   ac:=false;


Добавлено спустя 19 минут 25 секунд:
подскажите, пожалуйста, как сервер может получить подтверждение о том,что отправленные байты дошли до получателя, т.е. связь по ethernet есть

Re: Создание tcp сервера

СообщениеДобавлено: 24.02.2010 14:31:56
скалогрыз
Yurakl писал(а):подскажите, пожалуйста, как сервер может получить подтверждение о том,что отправленные байты дошли до получателя, т.е. связь по ethernet есть

никак! Клиент должен отписаться серваку, о том что байты получены.

Re: Создание tcp сервера

СообщениеДобавлено: 26.02.2010 10:22:42
Yurakl
Кстати команда send возвращает количество переданных символов!и если клиент отрублен, то соответственно она возвратит -1.