Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сетевое программирование
 
 автор: alexander95   (13.02.2011 в 22:57)   письмо автору
 
 

В таком случае, раз про c++ никто не знает, кто может мне подсказать, какой язык ( из компилируемых ) наиболее подходит для сети?

  Ответить  
 
 автор: Саня   (13.02.2011 в 23:19)   письмо автору
 
   для: alexander95   (13.02.2011 в 22:57)
 

Многие языки умеют работать с сетью. По каким критериям вы оцениваете "подходящесть" языка для сетевых задач?
Вам просто нужно было попытать счастья на форуме http://softtime.ru/cpp/. Или погуглить. Я сразу нашел тучу примеров на С++ для сокетов под винду и под линукс.

Могу подсказать язык С# (если можно назвать его компилируемым). Я его неплохо знаю и программировал на нём взаимодействие по сети.

  Ответить  
 
 автор: alexander95   (14.02.2011 в 20:06)   письмо автору
 
   для: Саня   (13.02.2011 в 23:19)
 

Да. не было бы проблем, если бы мой разум ог вникнуть в ООП :)
А вообще с с++ ( да и с шарпом ) пробовал, но... запутался. Буду очень признателен, если обьясните основные ( ну то есть самые примитивные ) функции работы с сокетами на этих языках.. Заранее спасибо.

  Ответить  
 
 автор: Саня   (15.02.2011 в 11:33)   письмо автору
 
   для: alexander95   (14.02.2011 в 20:06)
 

Сервер:
using System;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace test {
  class Program {

    static void Main(string[] args) {

      // прослушиваем порт 12345 с любого IP
      TcpListener Listener = new TcpListener(IPAddress.Any, 12345);

      // начинаем слушать порт
      Listener.Start();

      // в цикле принимаем входящие соединения
      while ( true ) {

        // тут, собственно, происходит ожидание нового подключения
        Socket s = Listener.AcceptSocket();

        // в этот буффер запишутся данные, пришедшие от клиента
        byte[] buff = new byte[1024];

        // после подключения можно прочитать что нам скажет клиент
        s.Receive(buff);

        // печатаем в консоль что за данные получили от клиента
        Console.WriteLine("Server receive text: {0}", Encoding.ASCII.GetString(buff));

        // закрываем входящее подключение
        s.Close();
      }

    }

  }
}


Клиент:
using System;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace test {
  class Program {

    static void Main(string[] args) {

      // открываем сокет
      Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

      // соединяемся на порт 12345 по адресу 127.0.0.1
      s.Connect(new IPAddress(new byte[] {127, 0, 0, 1}), 12345);

      // отправляем серверу данные
      s.Send(Encoding.ASCII.GetBytes("Hello, server!"));

    }

  }
}


Это простейший пример на C#. Сервер одновременно может обработать только одно входящее соединение.

  Ответить  
 
 автор: alexander95   (15.02.2011 в 21:53)   письмо автору
 
   для: Саня   (15.02.2011 в 11:33)
 

Спасибо огромное!
Вот только жаль, что C# подходит только для Windows, да и, насколько я осведомлен, он является побитовым интерпретируемым и, соответственно, медленно работает. Но это мне не помешает, т.к. сейчас пишу клиент пока только для Win.

Я понял, до чего мог бы сузить задачу. Насколько я знаю, в C++ существует библиотека WSA [связанная с winsock*]. Вот хотелось бы поподробнее узнать про нее.

  Ответить  
 
 автор: Саня   (15.02.2011 в 22:52)   письмо автору
 
   для: alexander95   (15.02.2011 в 21:53)
 

Кстати говоря, всё что я писал для сети на C# было для линукса. Есть реализация .NET платформы для линукс под названием mono. Доходило до того, что я под виндой в visual studio писал код, компилировал его и без каких-либо промежуточных заморочек запускал экзэшник в линуксе.

> насколько я осведомлен, он является побитовым интерпретируемым и, соответственно, медленно работает.
Исходник транслируется в CIL-код. Который, в дальнейшем, может компилироваться в машинные коды посредством JIT-компиляции. Но даже без JIT-компиляции он очень быстр.

> Насколько я знаю, в C++ существует библиотека WSA [связанная с winsock*].
> Вот хотелось бы поподробнее узнать про нее.
В C# возможно использовать неуправляемый код через System.Runtime.InteropServices. Например winapi. Я уже делал такое как-то.

  Ответить  
 
 автор: alexander95   (16.02.2011 в 18:48)   письмо автору
 
   для: Саня   (15.02.2011 в 22:52)
 

>Сервер одновременно может обработать только одно входящее соединение.
Но ведь потоки при этом использовать можно?

>В C# возможно использовать неуправляемый код через System.Runtime.InteropServices. Например winapi. Я уже делал такое как-то.
Можно поподробнее? :)

  Ответить  
 
 автор: Саня   (16.02.2011 в 21:17)   письмо автору
 
   для: alexander95   (16.02.2011 в 18:48)
 

> Но ведь потоки при этом использовать можно?
Не можно, а нужно.

> Можно поподробнее? :)
using System;
using System.IO;
using System.Runtime.InteropServices;

namespace test {
  class WinApi {
    public const int MAX_PATH = 260;
    public const int MAX_ALTERNATE = 14;

    [StructLayout(LayoutKind.Sequential)]
    public struct FILETIME {
      public uint dwLowDateTime;
      public uint dwHighDateTime;
    };

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct WIN32_FIND_DATA {
      public FileAttributes dwFileAttributes;
      public FILETIME ftCreationTime;
      public FILETIME ftLastAccessTime;
      public FILETIME ftLastWriteTime;
      public int nFileSizeHigh;
      public int nFileSizeLow;
      public int dwReserved0;
      public int dwReserved1;
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
      public string cFileName;
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_ALTERNATE)]
      public string cAlternate;
    }

    [DllImport("kernel32", CharSet = CharSet.Unicode)]
    public static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData);

    [DllImport("kernel32", CharSet = CharSet.Unicode)]
    public static extern bool FindNextFile(IntPtr hFindFile, out WIN32_FIND_DATA lpFindFileData);

    [DllImport("kernel32", CharSet = CharSet.Unicode)]
    public static extern bool FindClose(IntPtr hFindFile);
  }

}


using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace test {
  public partial class MainForm : Form {

    private static IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
    private static WinApi.WIN32_FIND_DATA findData;
    
    private static void Find(string path) {

      IntPtr file;
      file = WinApi.FindFirstFile(@"\\?\" + basePath + @"\*", out findData);

      if ( file != INVALID_HANDLE_VALUE ) {
        do {
          if ( findData.cFileName == "." || findData.cFileName == ".." ) continue;

          if ( ( findData.dwFileAttributes & FileAttributes.Directory ) != 0 ) {
            // ... что-то сделать с папкой ...
          } else {        
            // ... что-то сделать с файлом ...
          }

        } while ( WinApi.FindNextFile(file, out findData) );
      }
      WinApi.FindClose(file);
    }
  }
}

В данном случае используется WINAPI для итерации по папке. Стандартный способ мне не подошёл, так как не поддерживает пути длиной выше 260 символов и обойти это можно только используя неуправляемый код.

  Ответить  
 
 автор: alexander95   (16.02.2011 в 22:13)   письмо автору
 
   для: Саня   (16.02.2011 в 21:17)
 

Премного Вам благодарен:)

Может быть, Вы мне еще сможете объяснить, как собирать проект на разных языках (например, на том же C# и на C++) ?

  Ответить  
 
 автор: Саня   (16.02.2011 в 22:27)   письмо автору
 
   для: alexander95   (16.02.2011 в 22:13)
 

Что значит собирать проект на разных языках? В развитых средах разработки есть встроенный компилятор, который собирает проект в исполняемый файл или библиотеку. В visual studio это делается одной кнопкой.

  Ответить  
 
 автор: alexander95   (16.02.2011 в 22:34)   письмо автору
 
   для: Саня   (16.02.2011 в 22:27)
 

Я имел ввиду что какой то модуль пишу на другом языке. а потом компилирую все вместе.

  Ответить  
 
 автор: Саня   (16.02.2011 в 23:08)   письмо автору
 
   для: alexander95   (16.02.2011 в 22:34)
 

Не слышал о таком. Обычно в таких случаях каждый модуль разрабатывается и компилируется отдельно.

  Ответить  
 
 автор: alexander95   (16.02.2011 в 23:15)   письмо автору
 
   для: Саня   (16.02.2011 в 23:08)
 

Ну ладно, в любом случае спасибо за помощь!:)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования