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

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

Сообщение STAKANOV » 16.10.2005 13:19:36

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

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

Сообщение STAKANOV » 17.10.2005 13:09:47

Убрал все системозависимые вызовы. Теперь вот собирается и под 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;

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

Сообщение Иван Шихалев » 18.10.2005 00:10:36

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

Сообщение STAKANOV » 18.10.2005 10:16:51

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

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

Сообщение STAKANOV » 21.10.2005 18:32:08

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

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

Сообщение STAKANOV » 21.10.2005 21:42:30

А вот если вместо
Код: Выделить всё
ClientSocket:=Accept(MainSocket, sAddr, sAddrSize);


использовать (с включением соответвующего модуля)
Код: Выделить всё
ClientSocket:=WinSock.Accept(MainSocket, @sAddr, @sAddrSize);


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

Сообщение Иван Шихалев » 22.10.2005 00:24:00

SocketError значение 10014

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

Сообщение Иван Шихалев » 22.10.2005 00:27:36

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

Чудо, однако. Ибо ничего другого Sockets для Win32 и не делает - именно вызывает функции из WinSock.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение STAKANOV » 22.10.2005 06:51:47

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.

Ага. Я заглядывал в исходники и тоже удивился. Может параметры не правильно передает. Возможно из-за того, что тип данных не правильно определяется.
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение bw » 24.11.2005 11:12:28

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

..bw
bw
 

Сообщение STAKANOV » 24.11.2005 15:05:54

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

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

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

Сообщение bw » 24.11.2005 16:38:44

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

..bw
bw
 

Сообщение STAKANOV » 24.11.2005 23:17:44

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

Сообщение bw » 25.11.2005 09:30:28

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

..bw
bw
 

Сообщение STAKANOV » 25.11.2005 18:55:15

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

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


Вернуться в Сети

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

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

Рейтинг@Mail.ru