Конференция "Сети" » Асинхронные сокеты [D7, WinXP]
 
  • prodex (14.03.08 06:04) [0]
    Сокращенный код:
    ...
      ServSock:=Socket(AF_Inet,SOCK_STREAM,IPPROTO_TCP);
      Addr.sin_family:=AF_Inet;
      Addr.sin_addr.S_addr:=InAddr_Any;
      Addr.sin_port:=HToNS(4000);
      FillChar(Addr.sin_zero,SizeOf(Addr.sin_zero),0);
      Bind(ServSock,Addr,SizeOf(Addr));
      Listen(ServSock,SOMAXCONN);
      WSAAsyncSelect(ServSock,Handle,WM_SSocketEvent,FD_Read or FD_Accept or FD_Close or FD_Connect);
    ...
    //Отправка сообщения
    ...
    Addr.sin_family:=AF_Inet;
    Addr.sin_addr.S_addr:=Inet_Addr('localhost');
    Addr.sin_port:=HToNS(4000);
    Connect(ServSock,Addr,SizeOf(Addr));
    FStr:=TFileStream.Create('D:\111.xls',fmOpenRead);
    SetLength(OutBuf,FStr.Size);
    FStr.Position:=0;
    FStr.ReadBuffer(OutBuf[0],FStr.Size);
    n:=FStr.Size;
    Send(ServSock,OutBuf[0],n,0);
    ...

    Так вот при инициализации сокета как SOCK_STREAM после connect(...) WSAGetLastError возвращает ошибку WSAEINVAL : 'The socket is already bound to an address.' (Как указано в справке). Но при инициализации как SOCK_DGRAM все работает без проблем. И ещё вопрос: при SOCK_STREAM данные тож передаются пакетами не более какого-то размера?
  • Сергей М. © (14.03.08 10:19) [1]

    > Connect(ServSock


    Серверное гнездо никогда не является инициатором соединения, это право и обязанность клиентского гнезда.


    > при SOCK_STREAM данные тож передаются пакетами не более
    > какого-то размера?


    У потока (SOCK_STREAM) нет размера, поток он и есть поток.

    А буфер передачи действительно имеет фиксированный размер, по умолчанию он = 8к
  • grisme (14.03.08 11:51) [2]

    > //Отправка сообщения... Addr.sin_family:=AF_Inet; Addr.sin_addr.
    > S_addr:=Inet_Addr('localhost'); Addr.sin_port:=HToNS(4000);
    >  Connect(ServSock,Addr,SizeOf(Addr)); FStr:=TFileStream.
    > Create('D:\111.xls',fmOpenRead); SetLength(OutBuf,FStr.Size);
    >  FStr.Position:=0; FStr.ReadBuffer(OutBuf[0],FStr.Size);
    >  n:=FStr.Size; Send(ServSock,OutBuf[0],n,0);...


    во-первых, ^^^ странные действия. какой-такой connect для ServSock? O_o и, тем более, Send для ServSock.
    во-вторых, Ketmar меня правильно пнул, асинхронный режим -- это полная бяка. работай в блокирующем режиме + threads
  • Сергей М. © (14.03.08 12:02) [3]

    > асинхронный режим -- это полная бяка


    Не парь людям мозги)
    Любой режим имеет как свои преимущества, так и недостатки, все зависит от конкретных условий применения.
  • DVM © (14.03.08 16:32) [4]

    > асинхронный режим -- это полная бяка

    Зато этот режим лучше всего укладывается в событийную идеологию Windows.

    Посмотри на ICS, говорят сервера держат десятки тысяч соединений в одном потоке и все работает. В то же время представь себе десятки тысяч потоков (например на базе Indy). Сомневаюсь, что в случае десятка тысяч потоков все вообще будет нормально работать. Я уж молчу о корректном завершении всего этого дела и синхронизации если она нужна.
  • SpellCaster (14.03.08 17:42) [5]
    Да, но дебажить все это дело - убиться можно. К тому же процесс подключения, например, к сокс-проксе превращается в некий клубок макарон %).
  • Сергей М. © (14.03.08 19:19) [6]

    > дебажить все это дело - убиться можно


    Да ты что ?!)

    А мужики-то и не знают !..)...
  • piople © (17.03.08 06:36) [7]
    Синхронные, ассинхронные, все зависит от задачи...


    > prodex   (14.03.08 06:04)  

    http://www.citforum.ru/book/cook/winsock.shtml

    Файлы передаются точно так же, разве что надо пакеты в кучу склеить. К тому же еслы ты собираешся работать с ассинхронными сокетами, то тебе, на мой взгляд, приедтся туго. Ибо передавать файлы в синхронном режиме ИМХО проще...
 
Конференция "Сети" » Асинхронные сокеты [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0]