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

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

Помогите с winsocket в WinAPI [D6, D7, WinXP]


Страницы:   1 2

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]

Всем спасибо за внимание! Можете тему закрывать!


Страницы:   1 2

Наверх

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