Поиск:

Ответ в темуСоздание новой темы Создание опроса
> UDP, Посылаем и принимаем 
:(
    Опции темы
Bima
Дата 27.4.2007, 06:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Добрый день.
Как можно реализовать отправку данных по UDP?
По приему данных вроде обсуждалось (пока придерживаю данный вопрос).

P.S. без Indy


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
SenkraD
Дата 27.4.2007, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



могу дать пример на API
вот серверный поток
Код

DWORD WINAPI NetThread(LPVOID lpParam)
{
    SOCKET        sServerListen;
    struct sockaddr_in localaddr, 
            clientaddr;
    int           iSize;

    sServerListen = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sServerListen == INVALID_SOCKET)
    {
        MessageBox(0, "Can't create socket", "Error", 0);
        return 0;
    }
    localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    localaddr.sin_family = AF_INET;
    localaddr.sin_port = htons(5050);

    if (bind(sServerListen, (struct sockaddr *)&localaddr, 
            sizeof(localaddr)) == SOCKET_ERROR)
    {
        MessageBox(0, "Can't bind", "Error", 0);
        return 1;
    }
    
    MessageBox(0, "Bind OK", "Warning", 0);

    char buf[1024];

    while (1)
    {
        iSize = sizeof(clientaddr);
        int ret = recvfrom(sServerListen, buf, 1024, 0, 
            (struct sockaddr *)&clientaddr, &iSize);
        MessageBox(0, buf, "Warning", 0);
    }
    closesocket(sServerListen);
    return 0;
}


а вот код клиента
Код

    SOCKET        sSocket;
    struct sockaddr_in servaddr;
    char  szServerName[1024], szMessage[1024];
    struct hostent    *host = NULL;

    strcpy(szMessage, "This is message from client");
    strcpy(szServerName, "127.0.0.1");

    sSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sSocket == INVALID_SOCKET)
    {
        MessageBox(0, "Can't create socket", "Error", 0);
        return 0;
    }
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(5050);
    servaddr.sin_addr.s_addr = inet_addr(szServerName);

    if (servaddr.sin_addr.s_addr == INADDR_NONE)
    {
        host = gethostbyname(szServerName);
        if (host == NULL)
        {
            MessageBox(0, "Unable to resolve server", "Error", 0);
            return 1;
        }
        CopyMemory(&servaddr.sin_addr, host->h_addr_list[0],
            host->h_length);
    }

    sendto(sSocket, szMessage, 30, 0, (struct sockaddr *)&servaddr,
        sizeof(servaddr));

    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    WSACleanup();



там канечно малёха почистить нужно, но я думаю ты разберёшся


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Bima
Дата 27.4.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Попробовал код:
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Kod.h"
#include <winsock2.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner){}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
SOCKET        sSocket;
struct sockaddr_in servaddr;
char  szServerName[1024], szMessage[1024];
struct hostent    *host = NULL;

strcpy(szMessage, "This is message from client");  // передаваемок сообщение
strcpy(szServerName, (Edit2->Text).c_str());       // имя хоста (куда передаем)

sSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);   // создаем сокет
if (sSocket == INVALID_SOCKET)
{
    MessageBox(0, "Can't create socket", "Error", 0);  // выход, если неудачно создался
    return;
}
servaddr.sin_family = AF_INET;                        // Заполнение структуры
servaddr.sin_port = htons(StrToInt(Edit1->Text));
servaddr.sin_addr.s_addr = inet_addr(szServerName);

if (servaddr.sin_addr.s_addr == INADDR_NONE)          // ???
{
    host = gethostbyname(szServerName);
    if (host == NULL)
    {
        MessageBox(0, "Unable to resolve server", "Error", 0);
        return;
    }
    CopyMemory(&servaddr.sin_addr, host->h_addr_list[0],
        host->h_length);
}

sendto(sSocket, szMessage, 30, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); // наверно передача данных

WSACleanup(); // ???
}
//---------------------------------------------------------------------------


Убрал, все что посчитал нужным. На форме Edit1 и Edit2 и кнопка, где весь код написан. В Edit1 записываю порт, в Edit2 записываю хост.
при нажатии на кнопку выскакивает надпись "Can't create socket", то есть сокет не создался...
В каком направлении рыть???

еще я плохо понимаю этот код, часть я прокоментировал, а чать пометил вопросами. Если есть возможность пометьте кометариями код.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
SenkraD
Дата 27.4.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



Забыл написать что перед использование функций winsock её еще иниализировать нужно
Код

WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
    return;
}



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
fish9370
Дата 27.4.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Код

if (servaddr.sin_addr.s_addr == INADDR_NONE)          // если не является IP-адресом
{
    host = gethostbyname(szServerName);                   //пытаемся разрешить (resolve) IP-адрес
    if (host == NULL)
    {
        MessageBox(0, "Unable to resolve server", "Error", 0);
        return;
    }
    CopyMemory(&servaddr.sin_addr, host->h_addr_list[0],          //заполняем недостающую часть структуры полученым IP-адресом
        host->h_length);
}


Код

WSACleanup(); // закрытие сокета и освобождение памяти


Это сообщение отредактировал(а) fish9370 - 27.4.2007, 20:07


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Bima
Дата 28.4.2007, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



fish9370, за коментарии спасибо.
С отправкой вроде все получилось, хотя проверить не знаю как, сейчас пишу серверную часть для проверки, но возникают ошибки.
Вот код:
*.срр
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Kod.h"
#include <winsock2.h>
#include <exception>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
MyThread *MyTh;   //Поток
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner){}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
try{
   MyTh = new MyThread(true);  //создаем поток
   MyTh->FreeOnTerminate=true;
   }
catch(std::exception ex)
   {
   MessageBox(0,"Thread no create!!!", "Error", 0);
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
MyTh->Terminate();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
SOCKET        sSocket;
struct sockaddr_in servaddr;
char  szServerName[1024], szMessage[1024];
struct hostent    *host = NULL;
WSADATA wsaData;

if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)      // инициализации Socket
   {
   MessageBox(0, "Ошибка инициализации Socket", "Error", 0);
   return;
   }

strcpy(szMessage, "This is message from client");  // передаваемок сообщение
strcpy(szServerName, (Edit2->Text).c_str());       // имя хоста (куда передаем)

sSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);   // создаем сокет
if (sSocket == INVALID_SOCKET)
   {
   MessageBox(0, "Can't create socket", "Error", 0);  // выход, если неудачно создался
   return;
   }
servaddr.sin_family = AF_INET;                        // Заполнение структуры
servaddr.sin_port = htons(StrToInt(Edit1->Text));
servaddr.sin_addr.s_addr = inet_addr(szServerName);

if (servaddr.sin_addr.s_addr == INADDR_NONE)          // если не является IP-адресом
   {
   host = gethostbyname(szServerName);                // пытаемся разрешить (resolve) IP-адрес
   if (host == NULL)
       {
       MessageBox(0, "Unable to resolve server", "Error", 0);
       return;
       }
   CopyMemory(&servaddr.sin_addr, host->h_addr_list[0], host->h_length);           // заполняем недостающую часть структуры полученым IP-адресом
   }

sendto(sSocket, szMessage, 30, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); // наверно передача данных

WSACleanup(); // закрытие сокета и освобождение памяти
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
MyTh->Resume();
}
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
__fastcall MyThread::MyThread(bool CreateSuspended):TThread(CreateSuspended){};
//---------------------------------------------------------------------------
void __fastcall MyThread::Execute()
{
while (!Terminated)  // Выходим из потока, если выставлен флаг Terminated
   {
   if (!NetThread()) Suspend(); // Приостанавливаем поток если была ошибка
   }
}
//---------------------------------------------------------------------------
bool __fastcall MyThread::NetThread()
{
SOCKET        sServerListen;
struct sockaddr_in localaddr,
       clientaddr;
int           iSize;
WSADATA wsaData;

if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)  // инициализации Socket
   {
   MessageBox(0, "Ошибка инициализации Socket", "Error", 0);
   return false;
   }

sServerListen = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  // создаем сокет
if (sServerListen == INVALID_SOCKET)
   {
   MessageBox(0, "Can't create socket", "Error", 0);       // выход, если неудачно создался
   return false;
   }
localaddr.sin_addr.s_addr = htonl(INADDR_ANY);             // Заполнение структуры
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(161);

if (bind(sServerListen, (struct sockaddr *)&localaddr, sizeof(localaddr)) == SOCKET_ERROR)  //???
   {
   MessageBox(0, "Can't bind", "Error", 0);    //???
   return false;
   }

MessageBox(0, "Bind OK", "Warning", 0);

char buf[1024];

while (1)    //???
   {
   iSize = sizeof(clientaddr);    //???
   int ret = recvfrom(sServerListen, buf, 1024, 0, (struct sockaddr *)&clientaddr, &iSize);    //???
   MessageBox(0, buf, "Warning", 0);
   }
closesocket(sServerListen);    //???
return true;  //выход если удачно
}
//---------------------------------------------------------------------------

*.h
Код

//---------------------------------------------------------------------------

#ifndef KodH
#define KodH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
   TButton *Button1;
   TEdit *Edit1;
   TLabel *Label1;
   TLabel *Label2;
   TEdit *Edit2;
   TButton *Button2;
   void __fastcall Button1Click(TObject *Sender);
   void __fastcall Button2Click(TObject *Sender);
   void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
   void __fastcall FormCreate(TObject *Sender);
private:    // User declarations
public:        // User declarations
   __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


//---------------------------------------------------------------------------
class MyThread : public TThread
{            
private:
protected:
   void __fastcall Execute();
public:
   __fastcall MyThread(bool CreateSuspended);
   bool __fastcall NetThread();    //Чтения данных
};
//---------------------------------------------------------------------------

на форме все то же самое, только добавилась еще одна кнопка, для прослушивания UDP. Порт везде устанавливаю 161
при нажатии на Button2, запускается поток и вываливается сообщение "Can't bind"

при компилировани выскакивают предупреждения:
  [C++ Warning] Kod.cpp(134): W8004 'ret' is assigned a value that is never used
  [C++ Warning] Kod.cpp(135): W8066 Unreachable code
с первым понятно, я не использую переменную ret в цикле while
а второе предупреждение ссылается на строку: closesocket(sServerListen);

если не трудно объясните код, который помечен вопросами.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
SenkraD
Дата 28.4.2007, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



1.  инициализацию Winsock нужно делать только раз для всего приложения

2.   [C++ Warning] Kod.cpp(134): W8004 'ret' is assigned a value that is never used - говорит о том, что ты не используеш эту переменную, а вообще ты в неё количество полученных байт записываеш и это значение можно использовать для проверок разного типа

3. [C++ Warning] Kod.cpp(135): W8066 Unreachable code - у тебя нету выхода с бесконечного цикла поэтому код 
Код

closesocket(sServerListen);    //???    
return true;  //выход если удачно

никогда не выполнится, о чём тебя компилер и предупреждает

4. Это варнинти и они не столь страшни - по ути эти варнингы ошибки никогда не сделают, но сокет как-то закрыть нужно

P.S. Блин, а это ведь было в моём примере ))))


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Bima
Дата 28.4.2007, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Цитата

1.  инициализацию Winsock нужно делать только раз для всего приложения

поместил код в OnCreate.

цикл переписал вот так:

Код

int ret=0;

while (ret==0)
   {
   iSize = sizeof(clientaddr);
   ret = recvfrom(sServerListen, buf, 1024, 0, (struct sockaddr *)&clientaddr, &iSize);
   MessageBox(0, buf, "Warning", 0);
   }
closesocket(sServerListen);
return true;  //выход если удачно

но все равно , до цикла дело не доходит, поток останавливается на  строке:
Код

if (bind(sServerListen, (struct sockaddr *)&localaddr, sizeof(localaddr)) == SOCKET_ERROR)

ПОЧЕМУ???

Добавлено через 1 минуту и 33 секунды
P.S. теперь варнинги убрались
P.P.S. что делает строка if (bind(sServerListen, (struct sockaddr *)&localaddr, sizeof(localaddr)) == SOCKET_ERROR)   ?


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
SenkraD
Дата 28.4.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



она привязывает твою прогу (сервер) ко всем возможным ip-адрессам твоей машини и указаному порту

Может что-то уже этот порт слушает поэтому bind и не проходит


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Bima
Дата 28.4.2007, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



с bind разобрался... настройки сети в виртуальной машине были не те... запустил программу на основной машине, все заработало...
спасибо


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0540 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.