vaibhav vijay Ответов: 3

Данные не доставляются на сервер после сокета.Отправить С#


Я написал клиентскую программу сокета на своем конце, в которой я отправляю данные в цикле на сервер.Но когда я отправляю данные i цикл через "socket.send(buffer);" данные не доставляются на серверную сторону.

Если я предоставляю немного сна между двумя пакетами данных, то он доставляется правильно.Но мой этот сон очень важен для моего приложения.Мне нужно отправить пакет в то же время, когда он инициируется.Это приложение финансовой области, поэтому требуется доставка в то же время.


некоторые примеры кода:--
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(Ip), Convert.ToInt32(port));
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


public void GetConnectedServer()
{
server.Connect(ipep);
}

public void SendData(byte[] data)
{
int sentbytes = server.Send(data,SocketFlags.None);
}

public byte[] RecvResponse()
{
  byte[] recBuffer1 = new byte[1024];
  try
  {
    int recvBytes = server.Receive(recBuffer1, SocketFlags.Peek);
    recBuffer1=new byte[recvBytes];
    recvBytes = server.Receive(recBuffer1, 0, recvBytes, SocketFlags.None);
   }
   catch(SocketException ex)
   {
   throw ex;
   }
return recBuffer1;
}

Выше приведены функции клиента, используемые для коомуникации с сервером.Мой прием работает нормально.

С уважением
Вайбхав

3 Ответов

Рейтинг:
1

koll Zhu

u выберите синхронный метод отправки,он просто копирует байты в буфер отправки базовой системы.и msdn говорит,что для повышения эффективности сети базовая система может задержать отправку acntion до тех пор,пока у нее не будет достаточного количества байтов.возможно, именно поэтому он хорошо работает, когда вы заставляете поток спать.u может попробовать неблокирующую отправку.


vaibhav vijay

Я пробовал с неблокирующим, но это не решает проблему.

koll Zhu

это так озадачивает ... однажды я сыграл трюк, чтобы атаковать веб-сервер моего коллеги.я использовал сокет(tcp) для имитации протокола http(сделайте http-сообщение ручным и непрерывно отправляйте его на веб-сервер, идентифицированный ip-адресом и портом 80).
я использую неблокирующий метод ,он отлично работает... а логический код-это почти санме для Урса

vaibhav vijay

На самом деле мой весь вышеперечисленный код находится в веб-сервисе asmx.И это мое требование, что я должен быть в receive все время, отправляю ли я что-либо или нет, поэтому, если я сделаю сокет неблокирующим, он будет постоянно выдавать исключение, которое может быть накладным расходом производительности с моим приложением.Есть ли какая-либо конфигурация параметров через веб-сервис, которая может блокировать мою отправку?

Рейтинг:
0

Lukasz Gwizdz (Member 2097797)

Если вам нужна немедленная отправка вы рассматривали возможность отключения Nagle алгоритм(TCP_NODELAY вариант)?

Разъем.Свойство NoDelay[^]

С уважением!
Лукаш


[Править член="Тадит"]
Текст ссылки добавлен, чтобы отразить название статьи.
[/Редактировать]


Рейтинг:
0

koll Zhu

я проверил код, и все в порядке. я советую вам отладить серверную программу и следить за байтами связи.