Программа UDP
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading
Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
Dim broadcast As IPAddress = IPAddress.Parse("217.11.160.16")
Dim ep As New IPEndPoint(broadcast, 27015)
Try
Do While True
If s.Connected Then
Dim sendbuf(255) As Byte
s.Receive(sendbuf)
send_server(sendbuf)
Else
s.Connect(ep)
End If
Loop
Catch ex As Exception
Console.WriteLine(ex.ToString)
c1.Abort()
z1.Abort()
End Try
вот когда я создаю сенбаф размером 255 бывает что оно больше чем нада. мне надо знат заранеее какой число байтов пришло.
на тсп сокете ето делает
прошу подскозат что писать место s.Available ?
ошибку выдает такой
System.Net.Sockets.SocketException: Сообщение, отправленное на сокет датаграмм,
было больше, чем буфер внутренних сообщений или был превышен иной сетевой параме
тр. Также возможно, что буфер для принятия сообщения был меньше, чем размер сооб
щения
сам написал но ест проблема знающие люди прошу помочь
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading
Module Module1
Dim z As New ThreadStart(AddressOf receive_server)
Dim z1 As New Thread(z)
Dim c As New ThreadStart(AddressOf receive_Client)
Dim c1 As New Thread(c)
'Client
Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
Dim broadcast As IPAddress = IPAddress.Parse("217.11.160.16")
Dim ep As New IPEndPoint(broadcast, 27015)
'Server
Private Const listenPort As Integer = 27015
Dim listener As New UdpClient(listenPort)
Dim serip As IPAddress = IPAddress.Parse("192.168.1.10")
Dim groupEP As New IPEndPoint(serip, listenPort)
Public Function Send_client(ByVal sendbuf() As Byte) As Integer
s.SendTo(sendbuf, ep)
End Function
Sub receive_Client()
Try
Do While True
If s.Connected Then
Dim sendbuf(255) As Byte
s.Receive(sendbuf)
send_server(sendbuf)
Else
s.Connect(ep)
End If
Loop
Catch ex As Exception
Console.WriteLine("ошибка Client > > > " & ex.ToString)
c1.Abort()
z1.Abort()
End Try
End Sub
Sub receive_server()
Try
Do While True
Dim bytes As Byte() = listener.Receive(groupEP)
Send_client(bytes)
Loop
Catch e As Exception
Console.WriteLine("ошибка Server > > > " & e.ToString())
c1.Abort()
z1.Abort()
Finally
listener.Close()
End Try
End Sub
Sub send_server(ByVal sendbuf() As Byte)
listener.Send(sendbuf, sendbuf.Length, groupEP)
End Sub
Sub Main()
Console.WriteLine("server zapushen")
z1.Start()
Console.WriteLine("client zapushen")
c1.Start()
End Sub
End Module
ошибку выдает такой
на сокет датаграмм, было больше, чем буфер внутренних сообщений или был превышен
иной сетевой параметр. Также возможно, что буфер для принятия сообщения был мен
ьше, чем размер сообщения
в System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size,
SocketFlags socketFlags)
в System.Net.Sockets.Socket.Receive(Byte[] buffer)
в udp_mintext.Module1.receive_Client() в D:\Documents and Settings\admin\Loca
l Settings\Application Data\Temporary Projects\udp_mintext\Module1.vb:строка 29
проблема тут
s.Receive(sendbuf)
массив sendbuf больше чем надо .вот и вопрос что делать ? .как заранее узнать какой размер пакета пришло ?
заранее всех благодарю
' ...
Dim sendbuf(255) As Byte
' ...
Loop
Вы выделяете буфер в каждой итерации цикла Do While True, там оперативной памяти не плохо еще? :) Для начала - выделите его один раз до входа в цикл.
как заранее узнать какой размер пакета пришло ?
Только анализировать TCP-фреймы. Но с помощью тех средств, которыми вы пользуетесь, это сделать невозможно (да и не нужно для вашей задачи), поэтому ответ - никак. Создайте просто асинхронный сокет и ждите, пока в буфере что-то не появится. Как вариант - можно читать по одному байту.
(почему-то локальные переменные вспомнились)
mgelimgeli, а если в Receive указать количество принимаемых байт? Не более 256. Что-нибудь изменится?
И ещё, с такими названиями переменных - z, z1, c, c1, etc - нет никакого желания смотреть ваш код. Дайте названия, сразу говорящие о том, что это.
UPD: Для отладки такого софта очень советую Wireshark, реально облегчает жизнь. Кстати, попробуйте поснифить им: наверняка найдёте ещё ошибки в работе, да и отладка действительно очень упростится.
If s.Connected = False Then
s.Connect(ep)
End If
Try
Do While True
Dim sendbuf(8192) As Byte
Dim n As Integer
n = s.Receive(sendbuf)
ReDim Preserve sendbuf(n - 1)
send_server(sendbuf)
Loop
Catch ex As Exception
Console.WriteLine("ошибка Client > > > " & ex.ToString)
c1.Abort()
z1.Abort()
End Try
End Sub
If s.Connected = False Then
s.Connect(ep)
End If
Try
Dim sendbuf(8192) As Byte,n As Integer
Do While True
n = s.Receive(sendbuf)
ReDim Preserve sendbuf(n - 1)
send_server(sendbuf)
Loop
Catch ex As Exception
Console.WriteLine("ошибка Client > > > " & ex.ToString)
c1.Abort()
z1.Abort()
End Try
End Sub
If s.Connected = False Then
s.Connect(ep)
End If
Try
Dim sendbuf(8192) As Byte,n As Integer
Do While True
n = s.Receive(sendbuf)
ReDim Preserve sendbuf(n - 1)
send_server(sendbuf)
Loop
Catch ex As Exception
Console.WriteLine("ошибка Client > > > " & ex.ToString)
c1.Abort()
z1.Abort()
End Try
End Sub
@pixo $oft какая разница до или после цикла ? . я не спорю но вроде оно не мешать мне _)) все равно сделаю как вы сказали _)
Угу, только зачем каждый раз копировать буфер? Вот этим: ReDim Preserve.
Нужно нормально называть и объявить переменные:
Dim bytesReceived As Integer
Do While True
bytesReceived = s.Receive(buffer)
send_server(buffer, bytesReceived)
Loop
И соответствующим образом изменить send_server
listener.Send(buffer, bufferSize, groupEP)
End Sub
я сделал как ты сказал и прог не работает ))) так как после записи в сендбаф надо сначала создать массив битов для последующего записи а если оно не внутри то после ReDim Preserve массив становится не 8192 а становится таким как был предыдущий пакет так что по другому никак )) но все-равно сппп всеммм
Нужно нормально называть и объявить переменные:
Dim bytesReceived As Integer
Do While True
bytesReceived = s.Receive(buffer)
send_server(buffer, bytesReceived)
Loop
И соответствующим образом изменить send_server
listener.Send(buffer, bufferSize, groupEP)
End Sub
если я знал какой пакет идет с удаленного хоста то у меня небыли не каких проблем _) так что надо задать максимальный и после переделать
Значит нужно задать максимальный и знать размер фактических данных которые в нем лежат (что я продемонстрировал).