Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Текст программы «Клиент», использующей протокол UDP



#pragma once

#include < winsock.h>

#include < stdio.h>

#define WSA_NETEVENT (WM_USER+2)

#define SERVER_PORT 0x2001

#define CLIENT_PORT 0x2011

 

SOCKET    UDPSocket;

sockaddr_in    CallAddress;

sockaddr_in    OurAddress;

 

namespace Client {

    using namespace System;

    using namespace System:: ComponentModel;

    using namespace System:: Collections;

    using namespace System:: Windows:: Forms;

    using namespace System:: Data;

    using namespace System:: Drawing;

 

    public ref class Form1: public System:: Windows:: Forms:: Form

    {

    public:

              Form1(void)

              {

                       InitializeComponent();

              }

    protected:

              ~Form1()

              {

                       if (components)

                       {

                                 delete components;

                       }

              }

    private: System:: Windows:: Forms:: TextBox^ textBox1;

    private: System:: Windows:: Forms:: ListBox^ listBox2;

    private: System:: Windows:: Forms:: ListBox^ listBox1;

    private: System:: Windows:: Forms:: Button^ button2;

    private: System:: Windows:: Forms:: Label^ label1;

    private: System:: Windows:: Forms:: TextBox^ textBox2;

    private: System:: Windows:: Forms:: Label^ label2;

    private: System:: Windows:: Forms:: TextBox^ textBox3;

    private: System:: Windows:: Forms:: Label^ label3;

    private: System:: ComponentModel:: Container ^components;

 

#pragma region Windows Form Designer generated code

    void InitializeComponent(void)

    {

              // Текст этой функции генерируется автоматически, поэтому

    // он пропущен для краткости

}

#pragma endregion

private: System:: Void Form1_Load(System:: Object^ sender, EventArgs^ e) {

WSADATA    WSAData;

    int          rc;

    char       Name[101], *IpAddr, Buf[1000];

    PHOSTENT   phe;

                        

    rc = WSAStartup(MAKEWORD(2, 0), & WSAData);

    if (rc! = 0) {

              listBox1-> Items-> Add(" Ошибка инициализации WSAStartup" );

              return;

    } // if

 

    UDPSocket = socket(AF_INET, SOCK_DGRAM, 0);

    if (UDPSocket == INVALID_SOCKET) {

              listBox1-> Items-> Add(" Протокол UDP не установлен." );

    } // if

 

    memset(& OurAddress, 0, sizeof(OurAddress));

    OurAddress.sin_family = AF_INET;

    OurAddress.sin_port = CLIENT_PORT;

    rc = bind(UDPSocket, (LPSOCKADDR)& OurAddress,

              sizeof(sockaddr_in));

    if (rc == SOCKET_ERROR) {

              listBox1-> Items-> Add(" Адресная ошибка" );

              return;

    } // if

 

    rc= WSAAsyncSelect(UDPSocket, (HWND)(this-> Handle.ToInt32()),

 WSA_NETEVENT, FD_READ);

    if (rc! = 0) {

              listBox1-> Items-> Add(" Ошибка WSAAsyncSelect" );

              return;

    } // if

 

    gethostname(Name, 101);

    strcpy(Buf, " Имя компьютера " );

    strcat(Buf, Name);

    String ^ s= gcnew String(Buf);

    listBox1-> Items-> Add(s);

 

    phe = gethostbyname(Name);

    if (phe! = NULL) {

    memcpy((void *)& (OurAddress.sin_addr), phe-> h_addr, phe-> h_length);

    IpAddr = inet_ntoa(OurAddress.sin_addr);

    strcpy(Buf, " IP-Адрес " );

    strcat(Buf, IpAddr);

    String ^ s2= gcnew String(Buf);

    listBox1-> Items-> Add(s2);

    } // if

    listBox1-> Items-> Add(L" Клиент запущен" );

 }

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

protected: virtual void WndProc (Message% m) override

{

    int rc, l=sizeof(CallAddress);

    wchar_t Buf[500];

    

    if (m.Msg == WSA_NETEVENT) {

              if (m.LParam.ToInt32() == FD_READ) {

              rc = recvfrom((SOCKET)m.WParam.ToInt32(), (char *)Buf,

sizeof(Buf)-1, 0, (PSOCKADDR)& CallAddress, & l);

                       if (rc == SOCKET_ERROR) {

                      rc = WSAGetLastError();

                     listBox1-> Items-> Add(String:: Format( " Ошибка recv "

                                          " {0}", rc));

                                return;

                       } // if

                       if (rc > = 1) {

                                 String ^ s= gcnew String(Buf);        

                       listBox2-> Items-> Add(s);

                       } // if

              } // if

    } // if

      Form:: WndProc( m );

} // WndProc

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

private: System:: Void button2_Click(System:: Object^ sender, EventArgs^ e) {

    int rc, l, i;

    char Buf[500];

    wchar_t Buf2[1000];

    PHOSTENT phe;

 

    memset(& CallAddress, 0, sizeof(CallAddress));

    CallAddress.sin_family = AF_INET;

    CallAddress.sin_port = SERVER_PORT;

    l = textBox2-> Text-> Length;

    if (l > 0) {

              for (i=0; i < l; i++) {

                       Buf[i] = textBox2-> Text-> default[i];

                       Buf[i+1] = 0;

              } // for

              CallAddress.sin_addr.s_addr = inet_addr(Buf);

    } else {

              l = textBox3-> Text-> Length;

              if (l > 0) {

                       for (i=0; i < l; i++) {

                                 Buf[i] = textBox3-> Text-> default[i];

                                 Buf[i+1] = 0;

                       } // for

                       phe = gethostbyname(Buf);

                       if (phe! = NULL) {

                                 memcpy((void *)& (CallAddress.sin_addr), phe-> h_addr,

phe-> h_length);

                       } // if

              } else {

                                 return;

                       } // else

              } // else

 

              l = textBox1-> Text-> Length;

              if (l > 0) {

                       for (i=0; i < l; i++) {

                                 Buf2[i] = textBox1-> Text-> default[i];

                                 Buf2[i+1] = 0;

                       } // for

 

                  rc = sendto(UDPSocket, (char *)Buf2, 2*l+2, 0,

(LPSOCKADDR)& CallAddress, sizeof(CallAddress));

                       if (rc == SOCKET_ERROR) {

                           rc = WSAGetLastError();

                           listBox1-> Items-> Add(String:: Format(" Ошибка recv "                                             " {0}", rc));

                        return;

              } // if

              String ^ s= gcnew String(Buf2);

              listBox2-> Items-> Add(s);

    } // if

}// ----------------------------------------------------------------------------------------

    private: System:: Void Form1_FormClosed(System:: Object^ sender,

              System:: Windows:: Forms:: FormClosedEventArgs^ e) {

                       closesocket(UDPSocket);

                       WSACleanup();

    } //Form1_FormClosed

};

}


Приложение 2

Текст программы «Сервер», использующей протокол UDP

#pragma once

#include < winsock.h>

#include < stdio.h>

#define WSA_NETEVENT (WM_USER+2)

#define SERVER_PORT 0x2001

#define CLIENT_PORT 0x2011

 

SOCKET    UDPSocket;

sockaddr_in    CallAddress;

sockaddr_in    OurAddress;

 

namespace Server {

    using namespace System;

    using namespace System:: ComponentModel;

    using namespace System:: Collections;

    using namespace System:: Windows:: Forms;

    using namespace System:: Data;

    using namespace System:: Drawing;

using namespace System:: Security:: Permissions;

 

    public ref class Form1: public System:: Windows:: Forms:: Form

    {

    public:

              Form1(void)

              {

                       InitializeComponent();

              }

 

    protected:

              ~Form1()

              {

                       if (components)

                       {

                                 delete components;

                       }

              }

    private: System:: Windows:: Forms:: ListBox^ listBox1;

    private: System:: Windows:: Forms:: ListBox^ listBox2;

    private: System:: Windows:: Forms:: TextBox^ textBox1;

    private: System:: Windows:: Forms:: Button^ button1;

    private: System:: ComponentModel:: Container ^components;

 

#pragma region Windows Form Designer generated code

    void InitializeComponent(void)

    {

    // Текст этой функции генерируется автоматически, поэтому

    // он пропущен для краткости

    }

#pragma endregion

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

private: System:: Void Form1_Load(System:: Object^ sender, EventArgs^ e) {

WSADATA    WSAData;

    int          rc;

    char       Name[101], *IpAddr, Buf[1000];

    PHOSTENT phe;

                        

     rc = WSAStartup(MAKEWORD(2, 0), & WSAData);

     if (rc! = 0) {

              listBox1-> Items-> Add(" Ошибка инициализации WSAStartup" );

              return;

    } // if

 

    UDPSocket = socket(AF_INET, SOCK_DGRAM, 0);

    if (UDPSocket == INVALID_SOCKET) {

              listBox1-> Items-> Add(" Протокол UDP не установлен." );

    } // if

 

    memset(& OurAddress, 0, sizeof(OurAddress));

    OurAddress.sin_family = AF_INET;

    OurAddress.sin_port = SERVER_PORT;

    rc =bind(UDPSocket, (LPSOCKADDR)& OurAddress,

              sizeof(sockaddr_in));

    if (rc == SOCKET_ERROR) {

              listBox1-> Items-> Add(" Адресная ошибка" );

              return;

    } // if

                           

    rc = WSAAsyncSelect(UDPSocket, (HWND)(this-> Handle.ToInt32()),

WSA_NETEVENT, FD_READ);

    if (rc! = 0) {

              listBox1-> Items-> Add(" Ошибка WSAAsyncSelect" );

              return;

    } // if

 

    gethostname(Name, 101);

    strcpy(Buf, " Имя компьютера " );

    strcat(Buf, Name);

    String ^ s= gcnew String(Buf);

    listBox1-> Items-> Add(s);

 

    phe = gethostbyname(Name);

    if (phe! = NULL) {

              memcpy((void *)& (OurAddress.sin_addr), phe-> h_addr,

                       phe-> h_length);

              IpAddr = inet_ntoa(OurAddress.sin_addr);

              strcpy(Buf, " IP-Адрес " );

              strcat(Buf, IpAddr);

              String ^ s2= gcnew String(Buf);

              listBox1-> Items-> Add(s2);

    } // if

    listBox1-> Items-> Add(L" Сервер запущен" );

} // Form1_Load

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

protected: virtual void WndProc (Message% m) override

{

int rc, l=sizeof(CallAddress);

    wchar_t Buf[500];

    

    if (m.Msg == WSA_NETEVENT) {

              if (m.LParam.ToInt32() == FD_READ) {

                       rc = recvfrom((SOCKET)m.WParam.ToInt32(), (char *)Buf,

                                 sizeof(Buf)- 1, 0, (PSOCKADDR)& CallAddress, & l);

                       if (rc == SOCKET_ERROR) {

                                rc = WSAGetLastError();

                                listBox1-> Items-> Add(String:: Format(" Ошибка "

                                          " recvfrom {0}", rc));

                                return;

                       } // if

                       if (rc > = 1) {

                                 String ^ s= gcnew String(Buf);        

                       listBox2-> Items-> Add(s);

                       } // if

              } // if

    } // if

   Form:: WndProc( m );

} // WndProc

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

private: System:: Void button1_Click(System:: Object^ sender, EventArgs^ e) {

int rc, i, l;

    wchar_t Buf[501];

                                  

    l = textBox1-> Text-> Length;

    if (l == 0) return;

    for (i=0; i < l; i++) {

              Buf[i] = textBox1-> Text-> default[i];

              Buf[i+1] = 0;

    } // for

               

    rc = sendto(UDPSocket, (char *)Buf, 2*l+2, 0,

              (PSOCKADDR)& CallAddress, sizeof(CallAddress));

    if (rc == SOCKET_ERROR) {

              rc = WSAGetLastError();

              listBox1-> Items-> Add(String:: Format( " Ошибка sendto {0}", rc ));

              return;

    } // if

    listBox1-> Items-> Add(textBox1-> Text);           

} // button1_Click

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

private: System:: Void Form1_FormClosed(System:: Object^ sender,

System:: Windows:: Forms:: FormClosedEventArgs^ e) {

              closesocket(UDPSocket);

              WSACleanup();

    } //Form1_FormClosed

};

}


Приложение 3


Поделиться:



Последнее изменение этой страницы: 2020-02-16; Просмотров: 137; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.095 с.)
Главная | Случайная страница | Обратная связь