![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с winsocket в WinAPI [D6, D7, WinXP]
chemelin © (2008-01-15 12:30:00)Нужно написать на winsocket без VCL компонентов клиент-сервер которые будут обмениваться данными, помогите пожалуйста, если можно исходник или ссылки на статьи или готовые варианты реализации, буду очень благодарен, малое представление имею о winsocket но не могу реализовать передачу данных!
chemelin (2008-01-15 21:26:00) [1]Спасибо Вам за поддержку, уже все сделал, все работает, мне было лень читать документацию.
Сергей М. (2008-01-15 21:18:00) [2]А смысл ?
chemelin (2008-01-15 20:36:00) [3]
> Ты действительно идиот или оным прикидываешься ?)
прикидываюсь
Сергей М. (2008-01-15 19:57:00) [4]
> chemelin
Ты действительно идиот или оным прикидываешься ?)
Григорьев Антон (2008-01-15 19:52:00) [5]Нить - это то, что вы называете потоком. Я предпочитаю слово "нить", потому что поток - это не только thread, но и stream, возникает путаница. А код надо вставлять в тело специально созданной для этого нити. Вы же TCPClientThread сделали, значит, и с этим разберётесь.
chemelin (2008-01-15 19:28:00) [6]Вот смотрите:
//Создание Сервера
procedure crestserver;
var
wData : WSADATA;
sServerListen, sClient : TSOCKET;
localaddr, clientaddr : sockaddr_in;
iSize : Integer;
s1 : TCPClientThread;
begin
// Загрузка WinSock
if WSAStartup(MAKEWORD(1,1), wData) <> 0 then
begin
MessageBox(0, 'Не могу загрузить WinSock', 'Ошибка', 0);
exit;
end;
// Создание сокета
sServerListen := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if sServerListen = INVALID_SOCKET then
begin
MessageBox(0, 'Ошибка создания сокета', 'Ошибка', 0);
exit;
end;
// Запонение структуры адреса
localaddr.sin_addr.s_addr := htonl(INADDR_ANY);
localaddr.sin_family := AF_INET;
localaddr.sin_port := htons(5050);
//Связывание сокета с локальным адресом
if bind(sServerListen, localaddr, sizeof(localaddr)) = SOCKET_ERROR then
begin
TestWinSockError('Bind');
exit;
end;
//Прослушивание
if TestFuncError(listen(sServerListen, 4), 'Listen') then
exit;
MessageBox(0, 'Сервер запущен', 'Внимание!!!', 0);
while (true) do
begin
iSize := sizeof(clientaddr);
//Приём нового соединения
sClient := accept(sServerListen, @clientaddr, @iSize);
if sClient = INVALID_SOCKET then
begin
TestWinSockError('accept');
break;
end;
// Соединение принято, создаём поток
s1:=TCPClientThread.Create(true);
s1.Sock:=sClient;
s1.Resume;
end;
closesocket(sServerListen);
end;
При таком создании сервера происходит повисание, я толком не понял что такое "нить". Куда и какой здесь нужно вставить строки кода что бы не происходило повисание?? Помогите, я просто с сокетами работал очень мало.
Григорьев Антон (2008-01-15 19:22:00) [7]Так вы в отдельную нить выносите или неблокирующий сокет делаете?
И какая же ошибка возникает?
chemelin (2008-01-15 18:44:00) [8]Никак не могу убрать блокировку! ((((
Пробую это, не помогает, точнее с значением "1", ошибка:
Arg:=1;
IOCtlSocket(sServerListen,FIONBIO,Arg);
Григорьев Антон (2008-01-15 18:34:00) [9]
> chemelin (15.01.08 17:19) [25]
И что же конкретно вам непонятно? С нитями работать вроде умеете...
chemelin (2008-01-15 17:19:00) [10]
> 6. Делать accept в отдельной нити, которая больше ничем
> другим заниматься не будет - тогда её зависание всей остальной
> программе будет по барабану.
Покажи пожалуйста на примере я что-то не очень понял как делать accept в отдельной нити, статью прочитал. Извиняюсь! Буду очень благодарен!
Григорьев Антон (2008-01-15 16:33:00) [11]
> chemelin (15.01.08 12:30)
> если можно исходник или ссылки на статьи
Кстати, а вот это видели?
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1060
chemelin (2008-01-15 16:21:00) [12]
> Изволишь чтобы тебя хвалили за принципиальное нежелание
> читать документацию ?
Учту!
> Григорьев Антон
Спасибо!
Григорьев Антон (2008-01-15 16:10:00) [13]
> chemelin (15.01.08 15:38) [19]
> ещё один вопрос! Когда сервер стоит на прослушивании, ожидания
> приёма информации, он как будто бы повисает и никаких действий
> выполнить нельзя,
> все из за цикла while (true) do это как то исправить
Это не только из-за цикла while True do, это, в основном, из-за того, что функция accept по умолчанию работает в блокирующем режиме. Вариантов исправления много:
1. Использовать select с таймаутом и вызывать accept только если select показал готовность сокета
2. Перевести слушающий сокет в неблокирующий режим.
3. Используя WSAAsyncSelect, связать сокет с оконным сообщением и вызывать accept только по приходу этого сообщения.
4. Используя WSAEventSelect, связать сокет с событием и при необходимости проверять состояние этого события с помощью WSAWaitForMultipleEvents.
5. Использовать AcceptEx в режиме перекрытого ввода-вывода.
6. Делать accept в отдельной нити, которая больше ничем другим заниматься не будет - тогда её зависание всей остальной программе будет по барабану.
Ну и от цикла тоже (за исключением варианта 6), конечно, надо избавиться. Например, если вы выберете вариант 1 или 2, можно проверять по таймеру.
Сергей М. (2008-01-15 16:04:00) [14]
> chemelin (15.01.08 15:38) [19]
> как то исправить
Оч просто - либо задействовать неблок.режим слушающего гнезда либо вынести "стояние на прослушивании" в отдельный кодовый поток.
> И хватит меня критиковать
Изволишь чтобы тебя хвалили за принципиальное нежелание читать документацию ?
chemelin (2008-01-15 15:40:00) [15]
> Тут не затвердением пахнет - тут пахнет многократным штудированием
> от начала до конца)
признаюсь, WinAPI учил изначально на C++ , но WinAPI на Delphi очень пож на WinAPI С++.
И хватит меня критиковать!
chemelin (2008-01-15 15:38:00) [16]ещё один вопрос! Когда сервер стоит на прослушивании, ожидания приёма информации, он как будто бы повисает и никаких действий выполнить нельзя,
все из за циклаwhile (true) doэто как то исправить
Сергей М. (2008-01-15 15:32:00) [17]
> в том то и дело что нужен маленький размер
Только не надо бухтеть про дискетку и про нищих)
> нужно затвердить знание WinAPI
Тут не затвердением пахнет - тут пахнет многократным штудированием от начала до конца)
Ну и , к слову, WinAPI <> Win sockAPI
chemelin (2008-01-15 15:27:00) [18]
> Только не надо бухтеть про "размер")
ну в том то и дело что нужен маленький размер, с готовыми компонентами вопросов нет, с ними я уже работал воб-щем то сложности с ними нету. Ну и нужно затвердить знание WinAPI (хорошая вешь хоть и мороки хватает).
Сергей М. (2008-01-15 14:51:00) [19]Все же традиционный вопрос - готовые компонентычем не угодили ?)
Только не надо бухтеть про "размер")
chemelin (2008-01-15 14:10:00) [20]Всем спасибо за внимание! Можете тему закрывать!