Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 2
Регистрация: 17.02.2012
Сообщений: 22
1

Как из сокета вернуть число байт, которое пришло?

27.11.2012, 22:47. Показов 1842. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
ввобщем немогу понять как из сокета вернуть именно то число байт которое туда пришло пример:

C#
1
2
byte[] buf = new byte[1024];
int ibuf = ss.Receive(buf);
он возращает в 1024 допустим 600 байт а остальное забивает ноликами(((( это не приемлимо в моем случае как вернуть только сами данные в "ibuf" содержится количество байт в пакете но на массив байт buf не работает не resize не clone подскажите что делать!???
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2012, 22:47
Ответы с готовыми решениями:

Минимальное количество байт, которое займёт отрицательное число
Нужно узнать минимальное количество байт, которое займёт число. То есть в int у нас может быть...

Никак не могу понять, как узнать, сколько байт читать из сокета
Честно говоря, пишу не на C++, но вопрос этот может возникнуть в любом языке. Вот, допустим, я...

Прочитать несколько байт с сокета
Здравствуйте, уважаемые форумчане. Вопрос у меня следующий. reader::reader(QObject *parent) :...

Получить количество байт, готовых к считыванию из сокета
Как можно получить кол-во байт готовых к считыванию из TCP сокета? Добавлено через 8 минут в...

13
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
27.11.2012, 22:59 2

Не по теме:

Цитата Сообщение от Странный Посмотреть сообщение
Выручайте) соккеты
Прочитал как "Выручайте, скоты". Долго думал.



Цитата Сообщение от Странный Посмотреть сообщение
на массив байт buf не работает не resize не clone
Как это не работает?
C#
1
Array.Resize(ref buf, ibuf);
Но вопрос в другом: а по какой именно причине для вас неприемлимы нолики?
0
0 / 0 / 2
Регистрация: 17.02.2012
Сообщений: 22
27.11.2012, 23:01  [ТС] 3
СПАСИБО!
не приемлимы потому что идет прямая пересылка пакетов(нужно 1 в 1), если хотябы 1 лишний нолик проскакиевает дисконект...
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
27.11.2012, 23:02 4
Цитата Сообщение от Странный Посмотреть сообщение
идет прямая пересылка пакетов(нужно 1 в 1), если хотябы 1 лишний нолик проскакиевает дисконект...
Куда идет прямая пересылка?
И каким образом?

Сдается мне, "вы просто не умеете их готовить".
0
0 / 0 / 2
Регистрация: 17.02.2012
Сообщений: 22
27.11.2012, 23:08  [ТС] 5
не то что не умею даже не понимаю до конца, вообщем идея в следующем: чтобы с определенной программы шли пакеты на "эту" программу в ней происходили определенные изменения и пакеты уходили дальше ну это в идеале, пока что хотябы чтобы она пересылала просто эти пакеты с возможностью их просмотра, тренеруюсь на https портоколе он самый доступный вот наброски за посл час(((
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Net;
 
 
namespace ConsoleApplication1
{
 
    class Program
    {
       public Socket ssockclient;
       public Socket ss;
       public Socket outsoc;
 
       public void startc()
       {
           bool t = true;
           ssockclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           IPEndPoint ep = new IPEndPoint(IPAddress.Any, 5555);
           ssockclient.Bind(ep);
           ssockclient.Listen(5);
           ss = ssockclient.Accept();
           byte[] buf = new byte[10000];
           int n = 1;
            while (true)
            {
                Array.Resize(ref buf, 10000);
           int ibuf = ss.Receive(buf);
 
           Array.Resize(ref buf, ibuf);
        
           if (t == true)
           {
               Thread clientcc = new Thread(startcc);
               clientcc.Start();
               Thread.Sleep(200);
               t = false;
           }
          
         //  for (int v = 0; v < ibuf; v++)
         //  {
          //     Console.Write(buf[v] + " ");
         //  }
           Console.WriteLine("Текущий номер пакета отправки: " + n);
          n++;
           Console.WriteLine(Encoding.UTF8.GetString(buf));
           outsoc.Send(buf);
            }
       }
 
      public void startcc()
      {
          outsoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
          IPAddress output = IPAddress.Parse("89.248.189.83");// ип исходящего сервера сюда пишем тот который вам нужен
          IPEndPoint ipeout = new IPEndPoint(output, 8080);// порт
          outsoc.Connect(ipeout);//подключаемся к серверу удаленному
          byte[] buff = new byte[10000];
          int m = 1;
        while (true)
         {
             Array.Resize(ref buff, 10000);
              int ibuff = outsoc.Receive(buff);//получаем ответ
              Array.Resize(ref buff, ibuff);
             //for (int v = 0; v < ibuff; v++)
             // {
                 // Console.Write(buff[v] + " ");
            //  }
             
              ss.Send(buff);
              Console.WriteLine("Текущий номер пакета приема: " + m);
              Console.WriteLine(Encoding.UTF8.GetString(buff));
              m++;
          }
      }
 
      
 
      static void Main(string[] args)
    {
        
        Program ser = new Program();
        Thread clientc = new Thread(ser.startc);
        clientc.Start();
      
        //ser.start(port);
        Console.ReadKey();
    }
 
      
    }
 
}
если есть указать на какие то важные места буду признателен
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
27.11.2012, 23:10 6
C#
1
2
3
4
5
6
7
8
9
10
          byte[] buff = new byte[10000];
          int m = 1;
        while (true)
         {
              int ibuff = outsoc.Receive(buff);//получаем ответ             
              ss.Send(buff, 0, ibuff);
              Console.WriteLine("Текущий номер пакета приема: " + m);
              Console.WriteLine(Encoding.UTF8.GetString(buff, 0, ibuff));
              m++;
          }
1
0 / 0 / 2
Регистрация: 17.02.2012
Сообщений: 22
27.11.2012, 23:16  [ТС] 7
Спасибо еще раз! хочя с Resize тоже заработало)

Добавлено через 1 минуту
нет вру( пишет недопустимые аргументы
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
27.11.2012, 23:17 8
Цитата Сообщение от Странный Посмотреть сообщение
с Resize тоже заработало
Ну с Resize у вас каждый раз в памяти будет создаваться новый массив на ibuf элементов.
Зачем лишняя нагрузка? Да и время требуется на копирование элементов из старого массива в новый, а это вемя - задержка при получении следующего пакета.
1
0 / 0 / 2
Регистрация: 17.02.2012
Сообщений: 22
27.11.2012, 23:20  [ТС] 9
Цитата Сообщение от kolorotur Посмотреть сообщение
Ну с Resize у вас каждый раз в памяти будет создаваться новый массив на ibuf элементов.
Зачем лишняя нагрузка? Да и время требуется на копирование элементов из старого массива в новый, а это вемя - задержка при получении следующего пакета.
да пока мне хоть как то) разобрался, должно быть
C#
1
ss.Send(buff, ibuff,0);
.
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
27.11.2012, 23:22 10
Цитата Сообщение от Странный Посмотреть сообщение
C#
1
ss.Send(buff, ibuff,0);
Второй и третий аргументы поменяйте местами, а то сейчас вы отсылаете 0 байт.
Первый аргумент - массив.
Второй - индекс байта, с которого начинать отправку.
Третий - количество байтов для отправки.
0
0 / 0 / 2
Регистрация: 17.02.2012
Сообщений: 22
27.11.2012, 23:27  [ТС] 11
Цитата Сообщение от kolorotur Посмотреть сообщение
Второй и третий аргументы поменяйте местами, а то сейчас вы отсылаете 0 байт.
Первый аргумент - массив.
Второй - индекс байта, с которого начинать отправку.
Третий - количество байтов для отправки.
VS с вами не согласен(
Как из сокета вернуть число байт, которое пришло?
0
0 / 0 / 2
Регистрация: 17.02.2012
Сообщений: 22
27.11.2012, 23:28  [ТС] 12
если поменять как вы говорите вообще не работает говорит что нет такой перегрузки
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
27.11.2012, 23:36 13
Цитата Сообщение от Странный Посмотреть сообщение
если поменять как вы говорите вообще не работает говорит что нет такой перегрузки
Ну там же студия предлагает 8 различных перегрузок метода Send.
Писал по памяти, потому да - накосячил с аргументами.
Вот тот, что вам нужен:
C#
1
ss.Send(buff, 0, ibuff, SocketFlags.None);
1
Заблокирован
28.11.2012, 03:33 14
Почитайте про NetworkStream и вообще проблем не будет.
0
28.11.2012, 03:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2012, 03:33
Помогаю со студенческими работами здесь

Что пришло (и пришло ли?) на смену DCOM/RPC подходу?
Коллеги, кто распределенные приложения пишет - что пришло (и пришло ли?) на смену DCOM/RPC подходу?...

Как из 4-х байт, составляющих число типа double, получить это число?
Как из 4-х байт, составляющих число типа double, получить это число? Пример: unsigned char...

Дан массив из 6 байт. Посчитать количество байт число единиц, в которых не превышает 3.
Дан массив из 6 байт. Посчитать количество байт число единиц, в ко- торых не превышает 3. блин...

Дан массив размера N. Найти сумму элементов массива, превышающих число 5. (Как задать значение которое превышает число?)
Дан массив размера N. Найти сумму элементов массива, превышающих число 5 Как понять &quot;Найти сумму...

Как преобразовать число в массив байт
int n = 222333; // hex: 0003647D нужно получить массив байт из переменной n вида: byte m =...

Как получить число из массива байт?
Во такой код на Java при помощи побитовых операций раскладывает double на байты double d = 65.43;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru