Socket - не совсем спортировано

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

Ответить
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

В описании модуля Sockets написано, что он спортирован в Windows. Но все не совсем так просто. Например констата SOL_SOCKET при компиляции под win32 будет неопределена, а если ее значения просто поставить в функцию SetSocketOptions, то последняя выдаст ошибку о недопустимом уровне настроек.

Надо заметить, что кроссплатформенность FPC очень далека от совершенства. <_<
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Убрал все системозависимые вызовы. Теперь вот собирается и под FreeBSD и под Windows. Но в последнем категорически не устанавливается соединение (пробовал в wine и win98). Может кто сталкивался и знает в какую сторону копать?

Код: Выделить всё

 function ConnectionsManager(Data:pointer):Longint;
 var
  MainSocket,ClientSocket:Longint;
  sAddrSize:LongInt;
  sAddr:TINetSockAddr;
 begin
  ConnectionsManager:=0;
  SysMessage('Запускается менеджер соединений');
  MainSocket := Socket (AF_INET, SOCK_STREAM, 0);
  if MainSocket = -1 then
  begin
   SysMessage('Ошибка вызова socket');
   halt (1);
  end;
  
  sAddr.Family:=AF_INET;
  sAddr.Port:=htons(ServerPort);
  sAddr.Addr:=LongWord(StrToNetAddr('192.168.10.3'));
  
  if not Bind(MainSocket, sAddr, SizeOf(sAddr)) then
  begin
   SysMessage ('Ошибка вызова bind');
   halt (1);
  end;
   
  if not Listen(MainSocket,MaxConnections) then
  begin
   SysMessage ('Ошибка вызова listen');
   halt (1);
  end;
  
  repeat
   sAddrSize:=SizeOf(sAddr);
   SysMessage('Ожидаем соединение');
   ClientSocket:=Accept(MainSocket, sAddr, sAddrSize); [b]<=== ДО СЮДА ДОХОДИТ И ВСЕ, А КЛИЕНТ ВЕДЕТ СЕБЯ ТАК КАК БУДТО СЕРВЕР ВООБЩЕ НЕ ЗАПУЩЕН[/b]
   if ClientSocket<>-1 then
   begin
    BeginThread(@ClientIn,@ClientSocket);
   end;
  until False;
  // здесь надо вставить ожидание завершения дочерних процессов
  Shutdown(MainSocket,2);
  SysMessage('Менеджер соединений завершил свою работу');
 end;

Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Надо смотреть на предмет библиотек, дров и т.д.
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Иван Шихалев писал(а): Надо смотреть на предмет библиотек, дров и т.д.

:blink: вот тебе и кроссплатформенность :(
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Решил тут вернуться к этому вопросу - хочу чтоб везде работало. Собрал я свою программулину на windows 98 (fpc 2.0.0) получил третий результат - Accept в таком варианте возврашает -1, а в SocketError значение 10014. А на FreeBSD все по-прежнему хорошо работает :(

Для того, чтоб модуль sockets работал в виндовс так же хорошо как в бсд нужны какие-то специфические действия?
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

А вот если вместо

Код: Выделить всё

ClientSocket:=Accept(MainSocket, sAddr, sAddrSize); 


использовать (с включением соответвующего модуля)

Код: Выделить всё

ClientSocket:=WinSock.Accept(MainSocket, @sAddr, @sAddrSize);


то все начинает работать B) это плохо
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

SocketError значение 10014

А что это за ошибка?
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

А вот если вместо

Чудо, однако. Ибо ничего другого Sockets для Win32 и не делает - именно вызывает функции из WinSock.
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

SocketError значение 10014

А что это за ошибка?


WSAEFAULT (10014) Bad address.

Berkeley description: The system detected an invalid address in attempting to use an argument of a call.

WinSock description: Same as Berkeley, and then some. Specifically, v1.1 WinSock spec notes that this error occurs if the length of the buffer is too small. For instance, if the length of a struct sockaddr is not equivalent to the sizeof(struct sockaddr). However, it also occurs when an application passes an invalid pointer value.
<a href='http://www.sockets.com/err_lst1.htm' target='_blank'>источник</a>
Чудо, однако. Ибо ничего другого Sockets для Win32 и не делает - именно вызывает функции из WinSock.

Ага. Я заглядывал в исходники и тоже удивился. Может параметры не правильно передает. Возможно из-за того, что тип данных не правильно определяется.
bw

Сообщение bw »

У меня с "этим" проблем нет.
Bind делаю к 0 (sAddr.Addr=0). Хотя работает и с конкретным адресом. Пробовал на 80 порту. Сервер реагирует и IE коннектится.
w2ksp4, fpc2.0.0[2005/05/08].

..bw
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

У меня с "этим" проблем нет.

ты наверно невнимательно прочитал, функция accept из socket не корректно работает, как я понял баг пофиксили в 2.1.1

а ты именно модуль socket используешь или winsock ?
bw

Сообщение bw »

Именно Sockets. И именно Accept.
А сейчас плохо поню как там с сокетами работать, но, если не ошибаюсь, когда все потум, в твоем коде, должно отработать BeginThread(@ClientIn, @ClientSocket);? Я заменил этот код мессагой и мессага вылезла.

..bw
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

прикольно
т.е. получается все дело в Windows 98 ;)
bw

Сообщение bw »

На всякий случай спрошу.
Ты ведь знаешь, что клиент должен интересоваться сервером по адресу, к которуми сервер "забиндился". Например в твоем примере это 192.168.10.3, клиент, запущенный, на той же машине по адресу 127.0.0.1 ничего не получит.

..bw
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Например в твоем примере это 192.168.10.3, клиент, запущенный, на той же машине по адресу 127.0.0.1 ничего не получит.

кажется, да
но у меня клиент всегда хотел 192.168.10.3
Ответить