Socket - не совсем спортировано
Модератор: Модераторы
В описании модуля Sockets написано, что он спортирован в Windows. Но все не совсем так просто. Например констата SOL_SOCKET при компиляции под win32 будет неопределена, а если ее значения просто поставить в функцию SetSocketOptions, то последняя выдаст ошибку о недопустимом уровне настроек.
Надо заметить, что кроссплатформенность FPC очень далека от совершенства. <_<
Надо заметить, что кроссплатформенность FPC очень далека от совершенства. <_<
Убрал все системозависимые вызовы. Теперь вот собирается и под 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
- Откуда: Екатеринбург
- Контактная информация:
Решил тут вернуться к этому вопросу - хочу чтоб везде работало. Собрал я свою программулину на windows 98 (fpc 2.0.0) получил третий результат - Accept в таком варианте возврашает -1, а в SocketError значение 10014. А на FreeBSD все по-прежнему хорошо работает
Для того, чтоб модуль sockets работал в виндовс так же хорошо как в бсд нужны какие-то специфические действия?
Для того, чтоб модуль sockets работал в виндовс так же хорошо как в бсд нужны какие-то специфические действия?
А вот если вместо
использовать (с включением соответвующего модуля)
то все начинает работать B) это плохо
Код: Выделить всё
ClientSocket:=Accept(MainSocket, sAddr, sAddrSize); использовать (с включением соответвующего модуля)
Код: Выделить всё
ClientSocket:=WinSock.Accept(MainSocket, @sAddr, @sAddrSize);то все начинает работать B) это плохо
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
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
-
bw
