компьютерный форум
Вернуться   Компьютерный форум > Программирование и вебстроительство > Программирование

Ответ
 
LinkBack Опции темы Опции просмотра
Старый 17.09.2005, 23:51   #1
Пользователи
 
Регистрация: 17.09.2005
Сообщений: 134
По умолчанию

Необходимо передавать из приложения-клиента приложению-серверу вот такие структуры данных:

struct dat
{
uint datSize;
char [] dat;
}

Размер пакета, как видно, может изменяться. Помогите, пожалуйста, с реализацией на C#.




VA_DOS вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
17.09.2005, 23:51
Техник
реклама
По умолчанию

Старый 18.09.2005, 08:14   #2
Пользователи
 
Регистрация: 10.09.2004
Сообщений: 985
По умолчанию

send(sock,dat,sizeof(dat),0);
Вроде должно работать.
vxk7m вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 18.09.2005, 09:02   #3
Пользователи
 
Регистрация: 17.09.2005
Сообщений: 134
По умолчанию

А как я приму пакет, если не знаю его длины? Она может меняться!
VA_DOS вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 18.09.2005, 09:04   #4
Пользователи
 
Регистрация: 17.09.2005
Сообщений: 134
По умолчанию

Ну, я, вообще придумал так:

Клиент на порт1 посылает серверу длину сообщения. Сервер получает длину, соединяется с этим клиентом на порт2 и принимает само сообщение.

Только за такую реализацию меня куратор КП просто прибьет. Надо или алгоритм по-оптимальнее, или какую-реализацию с ОДНИМ портом. Клиентов может быть много.

Релиз нужен функций приема/передачи как клиента, так и сервера. Свой алгоритм, думаю, реализую и сам.
VA_DOS вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 18.09.2005, 12:10   #5
Пользователи
 
Регистрация: 17.09.2005
Сообщений: 134
По умолчанию

Вообще, я пишу Instant Messaging System (ну, типа своей ICQ). У меня как раз и будет реализовано все с помощью команд и параметров (длина, количество и тип которых будут для каждой команды различными). Все это будет инкапсулироваться перед передачей в одну строку, а при получении - анализироваться переданная команда и происходить соответствующий разбор параметров.
VA_DOS вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 18.09.2005, 16:58   #6
Пользователи
 
Регистрация: 10.09.2004
Сообщений: 985
По умолчанию

Цитата:
[b]Вообще, я пишу Instant Messaging System (ну, типа своей ICQ). У меня как раз и будет реализовано все с помощью команд и параметров (длина, количество и тип которых будут для каждой команды различными). Все это будет инкапсулироваться перед передачей в одну строку, а при получении - анализироваться переданная команда и происходить соответствующий разбор параметров.
Зделай буфер, длинной в 1024*4 байта. Первых несколько байт отведи под всю служебную лабуду, дальше пихай сам меседж. Чтобы не было переполнений - обрезай к ебеням всё, что больше 1024*4. В конец месаги мона прикрутить "признак конца месаги" (оригинально, правда =) - ето позволит длинные месаги делить и посылать в несколько пакетов, "признак конца месаги" лепи в конец последнего пакета. После получения "признака конца месаги" выводи всё сообщение на екран (хотя, думаю мона и почастям выводить, но всё зараз будет красивше смотрется).
ЗЫ он у тебя будет P2P или многопользовательский?
vxk7m вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 19.09.2005, 09:20   #7
Пользователи
 
Регистрация: 17.09.2005
Сообщений: 134
По умолчанию

Многопользовательский. Все через сервак (какая нагрузка на сервак...). Чувствую, со "сборкой" мессаг я намучаюсь. :P

Я так планирую передавать файлы.
VA_DOS вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 19.09.2005, 14:51   #8
Пользователи
 
Регистрация: 17.09.2005
Сообщений: 134
По умолчанию

Спасибо всем!
Написал, и даже работает!!!

Вот тестовые программки. Потом преобразую до структур.

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


byte [] msg;
string inp;
string ServerIP;
int port=2509;
TcpClient client;

Console.Write("Vvedite IP servera: ");
ServerIP=Console.ReadLine();
Console.Write("Vvedite stroku dlya otpravki na server: ");
inp=Console.ReadLine();
byte []tmp = Encoding.UTF8.GetBytes(inp);
msg=new byte [tmp.Length+4];
tmp.CopyTo(msg,4);
msg[0]=(byte)((tmp.Length>>0)%256);
msg[1]=(byte)((tmp.Length>>8)%256);
msg[2]=(byte)((tmp.Length>>16)%256);
msg[3]=(byte)((tmp.Length>>24)%256);
//Отправка данных на сервер
client = new TcpClient(ServerIP, port);
NetworkStream stream = client.GetStream();
stream.Write(msg, 0, msg.Length);
client.Close();
Сервер
Код:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;

int port = 2509;

TcpListener server = new TcpListener(IPAddress.Any, port);
// Старт сервера на прослушивание
server.Start();
 * * * 
// Буфер для полученных данных
byte [] data;
byte [] bdatlen = new byte [4];
int idatlen=0;
string str;

// Начинаем бесконечный цикл на прослушивание
while(true) 
{
 Console.Write("Waiting for a connection... ");
 TcpClient client = server.AcceptTcpClient(); * * * * * *
 Console.WriteLine("Connected!");

 // Получаем объект для чтения и записи
 NetworkStream stream = client.GetStream();

 // Чтение данных от клиента
 stream.Read(bdatlen, 0, 4); *// длина

 idatlen+=bdatlen[0]>>0;
 idatlen+=bdatlen[1]>>8;
 idatlen+=bdatlen[2]>>16;
 idatlen+=bdatlen[3]>>24;
 data=new byte [idatlen];

 stream.Read(data, 0, idatlen); *// мессага

 str=Encoding.UTF8.GetString(data,0,idatlen);

 Console.WriteLine(String.Format("Received: {0}", str));

 // Закрываем соединение
 client.Close();
}
VA_DOS вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Ответ


Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Вкл.



Текущее время: 21:37. Часовой пояс GMT.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Content Relevant URLs by vBSEO 3.5.0 RC2