fprecv с ошибкой 10057 'WSAENOTCONN' Socket is not connecte

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

fprecv с ошибкой 10057 'WSAENOTCONN' Socket is not connecte

Сообщение Виталий » 18.04.2013 21:38:38

Доброго всем. Мне нужно организовать работу с сокетами.
Никогда не работал с ними на уровне ниже ИНДИ, поэтому сходу столкнулся с препятствием. При получении данных из сокета выходит ошибка Socket is not connected на функции fprecv в серверной части.
Вот как выглядит ядро сервера:
Код: Выделить всё
var RecieveSocket:integer; RemoteIP:TInetSockAddr;Mem:Pointer;
     _in,_out:File of byte;  sizeBuf,SHLen:integer; _inText,_outText:text;s:ansistring;
begin

  Error:='';
  ServHandle.sin_addr.s_addr:=INADDR_ANY;
  ServHandle.sin_family:=AF_INET;
  ServHandle.sin_port:=htons(Port);
  SocketHandle:=fpsocket(AF_INET,SOCK_STREAM,0);
  if SocketHandle=-1 then begin Error:='fpsocket: Ошибка создания сокета'+' '+SysErrorMessageUTF8(GetLastOSError);
    if Assigned(OnError) then OnError(Self); exit;end;
  if fpbind(SocketHandle,@ServHandle,sizeof(ServHandle))=-1 then begin Error:='fpbind: Ошибка связывания сокета'+' '+SysErrorMessageUTF8(GetLastOSError);
    if Assigned(OnError) then OnError(Self); exit; end;
  if fplisten(SocketHandle,1)=-1 then  begin Error:='fplisten: Ошибка прослушивания порта'+' '+SysErrorMessageUTF8(GetLastOSError);
    if Assigned(OnError) then OnError(Self); exit;end;
  StopFlag:=false;
  Stream:=TMemoryStream.Create;
  Stream.SetSize(255);
  SHLen:=SizeOf(ServHandle);
  while not StopFlag do begin
   if fpaccept(SocketHandle,@ServHandle,@SHLen)<>-1 then begin
    if fprecv(SocketHandle,@s[1],5,0)<>-1 then begin
      if Assigned(OnRecieve) then OnRecieve(self);
    end else begin
       Error:='Server fprecv: '+IntToStr(socketerror)+' '+SysErrorMessageUTF8(GetLastOSError);
       if Assigned(OnError) then OnError(self);
    end;
   end else begin
    Error:='Server fpaccept: '+SysErrorMessageUTF8(GetLastOSError);
    if Assigned(OnError) then OnError(self);
   end;
  end;
  Stream.Clear;Stream.Free;Stream:=nil;
  fpshutdown(SocketHandle,0);
  CloseSocket(SocketHandle);
end;

fpaccept отрабатывает хорошо если с клиента передаю данные, но дальше fprecv(SocketHandle,@s[1],5,0) дает ошибку.
Вот код клиента:
Код: Выделить всё
  ServHandle.sin_addr.s_addr:=HostToNet((127 shl 24) or 1);
  ServHandle.port:=htons(Port);
  ServHandle.sin_family:=AF_INET;
  SocketHandle:=fpsocket(AF_INET,SOCK_STREAM,0);
  if SocketHandle<0 then begin Error:='client fpsocket: Ошибка создания сокета'+' '+SysErrorMessageUTF8(GetLastOSError);
    if Assigned(OnError) then OnError(self); exit;end;
...
if fpconnect(SocketHandle,@ServHandle,sizeof(ServHandle))=-1 then  begin
    Error:='client fpConnect: Ошибка коннекта'+' '+SysErrorMessageUTF8(GetLastOSError);   if Assigned(OnError) then OnError(self); exit; end;
if fpsend(SocketHandle,Memory,Size,0)=-1 then begin
    Error:='client fpSend: Ошибка передачи данных'+' '+SysErrorMessageUTF8(GetLastOSError);   if Assigned(OnError) then OnError(self); end;

Что я не учитываю?

P.S. FPC 2.6.0
Виталий
новенький
 
Сообщения: 40
Зарегистрирован: 05.01.2013 22:33:11

Re: fprecv с ошибкой 10057 'WSAENOTCONN' Socket is not conn

Сообщение VKB » 21.04.2014 16:46:22

Я понимаю, что прошёл уже год с момента вопроса, но всё же отвечу, потому что это распространённая ошибка, а никто так и не ответил.

Вызову Accept (или fpAccept) первым параметром передаётся слушающий сокет, а возвращает он не код ошибки, а именно уже рабочий сокет. В Вашем примере этот возвращаемый сокет просто сравнивается с -1 и теряется, а ведь именно его нужно использовать дальше в fpRecv или fpSend.

Это усугубляется тем, что документация отстаёт. В http://www.freepascal.org/docs-html/rtl ... ccept.html содержится устаревшее описание, не соответствующее текущей версии (я правда сравниваю с 2.6.2, но сомневаюсь, что в 2.6.4 вернули всё назад). Поэтому даже негде посмотреть как должен выглядеть рабочий низкоуровневый пример. Ну до кучи в примере к этой функции написано, что слушаемый порт будет 50000, а далее реально активируется порт 5000.
VKB
новенький
 
Сообщения: 33
Зарегистрирован: 07.09.2009 13:57:35


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

Рейтинг@Mail.ru
cron