![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Socket Read
Landgraph © (2002-12-06 14:34:00)И снова вопрос =)
Создан сокет (socket(), connect() - все путем...), а вот чем бы узнать: пришло на него что-нить (и желательно бы размер пришедшей инф-ции), дабы потом прочитать recv()?
Желательно бы примерчик(С/С++, Паскаль)... Но можете и просто послать в сторону какой-нить статьи по этому поводу (на citforum не посылать - был)...
Alex Konshin (2002-12-08 21:21:00) [1]http://msdn.microsoft.com/library/en-us/winsock/winsock/windows_sockets_start_page_2.asp
Landgraph (2002-12-08 17:11:00) [2]А как насчет линка? Откуда у бедного программиста деньги на книжку? Особенно у русского =)
Polevi (2002-12-08 13:22:00) [3]Э.Джонс, Д.Оланд
Программирование в сетях Microsoft Windows
Landgraph (2002-12-08 11:55:00) [4]А где можно почитать про эту функцию?
Вообще, где можно найти про программирование сокетов? Создание и закрытие сокета - ясно, а вот про манипуляции с сокетом побольше бы узнать... WSA*, etc...
Alex Konshin (2002-12-07 05:56:00) [5]2 Digitman: ясно же сказали, что socket() и connect(), т.е. это чистый Winsock.
ioctlsocket(FSocket,FIONREAD,len);
Только имей в виду, что это не обязательно будет пакет такой же длины, какой его послал отправитель. Ты вполне можешь получить только часть посылки или, наоборот, несколько посылок за раз.
Но это все еще зависит от типа сокета.
Digitman (2002-12-06 14:40:00) [6]это ты все "в одной процедуре" лепишь ?) т.е. гнездо - блокирующее ?
так ведь - вот он, примерчик, перед носом у тебя :
фрагмент файла scktcomp.pas (D5):
procedure TServerClientThread.ClientExecute;
var
FDSet: TFDSet;
TimeVal: TTimeVal;
begin
while not Terminated and ClientSocket.Connected do
begin
FD_ZERO(FDSet);
FD_SET(ClientSocket.SocketHandle, FDSet);
TimeVal.tv_sec := 0;
TimeVal.tv_usec := 500;
//вот здесь и узнаем, "пришло на него что-нить" аль нет))))
if (select(0, @FDSet, nil, nil, @TimeVal) > 0) and not Terminated then
if ClientSocket.ReceiveBuf(FDSet, -1) = 0 then Break
else Synchronize(DoRead);
if (select(0, nil, @FDSet, nil, @TimeVal) > 0) and not Terminated then
Synchronize(DoWrite);
end;
end;