![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приём сообщений от сервера [D6, Win95/98, WinME, NT4, Win2k, WinXP]
Andr-04 © (2006-07-31 15:12:00)Добрый день. Как обойтись без использования WSAAsyncSelect для отправления сообщений от сервера и их приёма КЛИЕНТОМ?
DiamondShark (2006-08-01 00:21:00) [81]
> connect(), а потом listen()?
технология клиент-сервер.
Ketmar (2006-07-31 21:27:00) [82]??? connect(), а потом listen()? или Вы с какими-то марсианскими сокетами работали, или странные очень мануалы курили...
есть подозрение, что остальной код "работы" примерно на том же уровне. я угадал?
Andr-04 (2006-07-31 15:48:00) [83]Нет, не получается. Перечислю ключевые вызовы процедур из своей программы:
var
fSocket: TSocket;
fBufSize, sz: Integer;
sa: TSockAddr;
begin
fSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if fSocket <> INVALID_SOCKET then
begin
FillChar(sa, SizeOf(TSockAddr), 0);
sa.sin_family := AF_INET;
sa.sin_port := htons(Port);
sa.sin_addr.S_addr := inet_addr(PChar(IP));
if connect(fSocket, sa, SizeOf(TSockAddr))>-1 then
if listen(fSocket, SOMAXCONN)=0 then
begin
sz:=sizeOf(fBufSize);
getsockopt(fSocket, SOL_SOCKET, SO_RCVBUF, PChar(@fBufSize), sz);
sz:=send(fSocket, buf, sz, 0);
...
sz:=recv(fSocket, buf[0], fBufSize, 0);
end;
end;
end;
При описанном выше варианте sz, та, что возвращается после recv, всегда -1. Вот я и спрашиваю как это исправить?
Нет, со стула я не падал - просто мы посты [1] и [2] отправили почти в одно время, поэтому я и не успел прочитать Ваш ответ. Просто я с сокетами всегда только в блокирующем режиме работал, с организацией нескольких потоков. Сейчас всё равно исправлять буду на неблокирующий режим, но, всё-же, в одном месте моей программы лучше использовать блокирующий режим (там осуществлена работа без потоков и необходимо ожидание результата).
Andr-04 (2006-07-31 15:42:00) [84]Нет, не получается. Перечислю ключевые вызовы процедур из своей программы:
<CODEvar
fSocket: TSocket;
fBufSize, sz: Integer;
sa: TSockAddr;
begin
fSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if fSocket <> INVALID_SOCKET then
begin
FillChar(sa, SizeOf(TSockAddr), 0);
sa.sin_family := AF_INET;
sa.sin_port := htons(Port);
sa.sin_addr.S_addr := inet_addr(PChar(IP));
if connect(fSocket, sa, SizeOf(TSockAddr))>-1 then
if listen(fSocket, SOMAXCONN)=0 then
begin
sz:=sizeOf(fBufSize);
getsockopt(fSocket, SOL_SOCKET, SO_RCVBUF, PChar(@fBufSize), sz);
sz:=send(fSocket, buf, sz, 0);
...
sz:=recv(fSocket, buf[0], fBufSize, 0);
end;
end;
end;>
При описанном выше варианте sz, та, что возвращается после recv, всегда -1. Вот я и спрашиваю как это исправить?
Сергей М. (2006-07-31 15:32:00) [85]
> как клиенту принимать сообщения от сервера в блокирующем
> режиме?
прямо так и принимать - recv()
> что должен выполнить сервер перед самой функцией send?
Ты со стула упал ?
Или не понимаешь , что такое "вопрос-ответ" при общении клиента с сервером ?
Andr-04 (2006-07-31 15:30:00) [86]Т.е. как клиенту принимать сообщения от сервера в блокирующем режиме? И, если нужно, что должен выполнить сервер перед самой функцией send? Спасибо.
Сергей М. (2006-07-31 15:29:00) [87]Прямо так и обойтись - не используя WSAAsyncSelect.