Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2013, 23:18   #1
alex081993
 
Регистрация: 01.12.2013
Сообщений: 7
По умолчанию UDP протокол

Народ, такой вопрос. Может есть у кого-то/видел/находил чат в виде клиент-сервер, который был реализован через UDP-протокол? без использования стандартных компонентов.
alex081993 вне форума Ответить с цитированием
Старый 01.12.2013, 23:24   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
без использования стандартных компонентов.
Тоесть на WinAPI c SOCK_DGRAM?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.12.2013, 16:54   #3
alex081993
 
Регистрация: 01.12.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Тоесть на WinAPI c SOCK_DGRAM?
да, с подключение библиотеки, т.е. без использования Indy компонентов...
alex081993 вне форума Ответить с цитированием
Старый 03.12.2013, 17:13   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... Вообще-то у меня ТСР есть на сокетах, но... попробую его подогнать под UDP. Неточности могут быть но хотя бы подскажу куда смотреть:
Код:
begin
 SocketHandle:=socket(AF_INET,SOCK_DGRAM,0);

 if SocketHandle<0 then
  begin Error:='client socket:Ошибка создания сокета '+IntToStr(socketerror)+' '+SysErrorMessage(GetLastOSError);
 end else

 if connect(SocketHandle,@ServHandle,sizeof(ServHandle))=-1 then  begin
    Error:='client Connect: Ошибка коннекта '+IntToStr(socketerror)+' '+SysErrorMessage(GetLastOSError);  
 end else
 if send(SocketHandle,mem,mSize,0)=-1 then begin
    Error:='client Send data: Ошибка передачи данных '+IntToStr(socketerror)+' '+SysErrorMessage(GetLastOSError); 
 end

// Если надо закрыть канал CloseSocket(SocketHandle);

end;
Здесь:
mem - Массив посылаемых байтов.
mSize - его размер
Библиотека winsock кажись. Я правда не помню как она в Делфи называется точно. Winsock2 по-моему

Теперь сервер:
Код:
  ServHandle.sin_addr.s_addr:=INADDR_ANY;
  ServHandle.sin_family:=AF_INET;
  ServHandle.sin_port:=htons(Port);
  ServHandleSize:=SizeOf(ServHandle);

  SocketHandle:=socket(AF_INET,SOCK_DGRAM,0);

  if SocketHandle=-1 then 
begin Error:=' Ошибка создания сокета '+IntToStr(socketerror)+' '+SysErrorMessage(GetLastOSError);

  if bind(SocketHandle,@ServHandle,sizeof(ServHandle))=-1 then 
begin Error:='Server: Ошибка связывания сокета '+IntToStr(socketerror)+' '+SysErrorMessage(GetLastOSError);



  while true do begin
    Fillchar(buff,SizeOf(buff),0);
    sLen=sizeof(ServHandle);
    if recvfrom(SocketHandle,buff,sizeof(buff),0,ServHandle,sLen)<>-1 then begin
     В буффере данные
    end;
  end;
  closesocket(ServHandle);
  end;
где buf:array[1..1024] of byte;
ServHandle - sockaddr_in

Вроде бы так.
Еще раз акцентирую что это с потолка.
I'm learning to live...

Последний раз редактировалось Stilet; 03.12.2013 в 17:15.
Stilet вне форума Ответить с цитированием
Старый 03.12.2013, 18:15   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

SOCK_DGRAM не нужен connect, можно сразу send
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 03.12.2013, 18:52   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну может быть. говорю же - с потолка.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.12.2013, 19:46   #7
alex081993
 
Регистрация: 01.12.2013
Сообщений: 7
По умолчанию

В принципе немного разобрался, как что, вроде написал для клиента приложение. В течении недели постараюсь сервер написать (как смогу), если не будет получаться, обращусь к вам)
alex081993 вне форума Ответить с цитированием
Старый 03.12.2013, 22:26   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Угу. Создашь тему на форуме.
Одна голова хорошо - а много: Змей Горыныч )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.12.2013, 21:27   #9
alex081993
 
Регистрация: 01.12.2013
Сообщений: 7
По умолчанию

Народ, возник такой вопрос. Как определить размер получаемого сообщения в function RecvFrom(S:TSocket;var Buf;Len,Flags:Integer;
var From:TSockAddr;var FromLen:Integer):Integer;; вот в этом месте buf.
Посылаю от клиента сообщение. Это получается и будет размер сообщения.
Ну и также в отсылке этого сообщения в серверу какой там размер указывать.
З.Ы. написал очень коряво, не ругайте)
alex081993 вне форума Ответить с цитированием
Старый 04.12.2013, 22:58   #10
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Посмотрите этот исходник
Вложения
Тип файла: zip UDPChat.zip (6.1 Кб, 26 просмотров)
Lardes вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UDP протокол :) Артэс Общие вопросы C/C++ 6 09.10.2012 17:46
ASTM протокол Freezer Общие вопросы Delphi 0 02.02.2011 16:53
Как остановить SendTo (UDP протокол) Dasharnb777 Общие вопросы .NET 0 23.11.2010 23:41
рассылка сообщений всем пользователям в чате, протокол UDP RKS Работа с сетью в Delphi 14 15.12.2007 11:36