|
|
|
| В таком случае, раз про c++ никто не знает, кто может мне подсказать, какой язык ( из компилируемых ) наиболее подходит для сети? | |
|
|
|
|
|
|
|
для: alexander95
(13.02.2011 в 22:57)
| | Многие языки умеют работать с сетью. По каким критериям вы оцениваете "подходящесть" языка для сетевых задач?
Вам просто нужно было попытать счастья на форуме http://softtime.ru/cpp/. Или погуглить. Я сразу нашел тучу примеров на С++ для сокетов под винду и под линукс.
Могу подсказать язык С# (если можно назвать его компилируемым). Я его неплохо знаю и программировал на нём взаимодействие по сети. | |
|
|
|
|
|
|
|
для: Саня
(13.02.2011 в 23:19)
| | Да. не было бы проблем, если бы мой разум ог вникнуть в ООП :)
А вообще с с++ ( да и с шарпом ) пробовал, но... запутался. Буду очень признателен, если обьясните основные ( ну то есть самые примитивные ) функции работы с сокетами на этих языках.. Заранее спасибо. | |
|
|
|
|
|
|
|
для: 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#. Сервер одновременно может обработать только одно входящее соединение. | |
|
|
|
|
|
|
|
для: Саня
(15.02.2011 в 11:33)
| | Спасибо огромное!
Вот только жаль, что C# подходит только для Windows, да и, насколько я осведомлен, он является побитовым интерпретируемым и, соответственно, медленно работает. Но это мне не помешает, т.к. сейчас пишу клиент пока только для Win.
Я понял, до чего мог бы сузить задачу. Насколько я знаю, в C++ существует библиотека WSA [связанная с winsock*]. Вот хотелось бы поподробнее узнать про нее. | |
|
|
|
|
|
|
|
для: alexander95
(15.02.2011 в 21:53)
| | Кстати говоря, всё что я писал для сети на C# было для линукса. Есть реализация .NET платформы для линукс под названием mono. Доходило до того, что я под виндой в visual studio писал код, компилировал его и без каких-либо промежуточных заморочек запускал экзэшник в линуксе.
> насколько я осведомлен, он является побитовым интерпретируемым и, соответственно, медленно работает.
Исходник транслируется в CIL-код. Который, в дальнейшем, может компилироваться в машинные коды посредством JIT-компиляции. Но даже без JIT-компиляции он очень быстр.
> Насколько я знаю, в C++ существует библиотека WSA [связанная с winsock*].
> Вот хотелось бы поподробнее узнать про нее.
В C# возможно использовать неуправляемый код через System.Runtime.InteropServices. Например winapi. Я уже делал такое как-то. | |
|
|
|
|
|
|
|
для: Саня
(15.02.2011 в 22:52)
| | >Сервер одновременно может обработать только одно входящее соединение.
Но ведь потоки при этом использовать можно?
>В C# возможно использовать неуправляемый код через System.Runtime.InteropServices. Например winapi. Я уже делал такое как-то.
Можно поподробнее? :) | |
|
|
|
|
|
|
|
для: 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 символов и обойти это можно только используя неуправляемый код. | |
|
|
|
|
|
|
|
для: Саня
(16.02.2011 в 21:17)
| | Премного Вам благодарен:)
Может быть, Вы мне еще сможете объяснить, как собирать проект на разных языках (например, на том же C# и на C++) ? | |
|
|
|
|
|
|
|
для: alexander95
(16.02.2011 в 22:13)
| | Что значит собирать проект на разных языках? В развитых средах разработки есть встроенный компилятор, который собирает проект в исполняемый файл или библиотеку. В visual studio это делается одной кнопкой. | |
|
|
|
|
|
|
|
для: Саня
(16.02.2011 в 22:27)
| | Я имел ввиду что какой то модуль пишу на другом языке. а потом компилирую все вместе. | |
|
|
|
|
|
|
|
для: alexander95
(16.02.2011 в 22:34)
| | Не слышал о таком. Обычно в таких случаях каждый модуль разрабатывается и компилируется отдельно. | |
|
|
|
|
|
|
|
для: Саня
(16.02.2011 в 23:08)
| | Ну ладно, в любом случае спасибо за помощь!:) | |
|
|
|