Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Приём сообщений от сервера [D6, Win95/98, WinME, NT4, Win2k, WinXP]


Страницы:   1 2 3 4 5

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.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо