Winsock & каналы связи

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
FSO
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 17.04.2005 (Вс) 11:50

Winsock & каналы связи

Сообщение FSO » 14.06.2005 (Вт) 14:57

Добрый день!

Пишу небольшой чат(не пинайте ногами), и интересует такой вопрос:
Может ли винсок обрабатывать несколько каналов связи, например на одном канале общаются, по другой передают файлы и т.д.
Или нужно создавать несколько винсоков для 1 канала, для другого???

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 14.06.2005 (Вт) 14:59

Можно. Передавай по разным портам. Или по одному, но пакеты с заголовками. :roll:

FSO
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 17.04.2005 (Вс) 11:50

Сообщение FSO » 14.06.2005 (Вт) 15:03

ALX_2002 писал(а):Можно. Передавай по разным портам. Или по одному, но пакеты с заголовками. :roll:


эээ можно узнать как?

FSO
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 17.04.2005 (Вс) 11:50

Сообщение FSO » 14.06.2005 (Вт) 15:28

И еще как можно указать одному винскоу несколько портов?

Код: Выделить всё
With wsk
.Protocol = sckTCPProtocol
.RemoteHost = IPAdress1
.RemotePort = 12345 ' можно же указать только один порт
.Connect
End With

Alexander N. Samarin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 397
Зарегистрирован: 05.03.2005 (Сб) 20:59
Откуда: Интернат 18 (СУНЦ МГУ), комната 214А, кровать посередине

Сообщение Alexander N. Samarin » 14.06.2005 (Вт) 17:14

Имеется в виду несколько винсоков Изображение
На это не смотрите! Это не подпись!!!!!!

FSO
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 17.04.2005 (Вс) 11:50

Сообщение FSO » 14.06.2005 (Вт) 18:19

Имеется в виду несколько винсоков

Жалко что нельзя одним винскоком открыть порта 2-3... :))

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сообщение Jenizix » 14.06.2005 (Вт) 18:48

Можно сделать один винсок который будет висеть на порту и массив винсоков которым он будет передавать новые соединения, ищи по форуму тут этого добра море!!!!!!!!
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.06.2005 (Вт) 19:02

FSO писал(а):
ALX_2002 писал(а):Можно. Передавай по разным портам. Или по одному, но пакеты с заголовками. :roll:


эээ можно узнать как?

Как захочешь. Сам Винсок заголовки в твои данные не добавит.
Посмотри, например, HTTP - там умудряются (о чудо!) через один порт и страницы и картинки передавать, и не путаются :lol:
Изображение

FSO
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 17.04.2005 (Вс) 11:50

Сообщение FSO » 14.06.2005 (Вт) 22:24

Все запутался по полной... :((( Выручайте:

----сервер-----
Код: Выделить всё
Option Explicit
'используем локальны порт с номером 12345
Private Const WSK_LOCAL_PORT = 12345 ' для приема текстовых сообщений
Private Const WSK_Name_port = 12346 ' для приема имен юзеров
'максимальное кол-во одновреммено открытых сеансов
Private Const MAX_SESSIONS = 11


Private Sub UpdateStatus()
Dim i As Integer
Dim actsess As Integer
For i = 1 To MAX_SESSIONS
    With wsk(i)
        If .State = sckConnected Then
            actsess = actsess + 1
        End If
    End With
Next
With lbStatus
.Caption = "Занятые сеансы: " & Trim$(Str$(actsess))
End With
End Sub

Private Sub Form_Load()
Dim i As Integer

' задаем параметры винсока
With wsk(0)
' устанавливаем TCP протокол
.Protocol = sckTCPProtocol
' определяем локальный порт
.LocalPort = WSK_LOCAL_PORT
' вызываем метод listen
.Listen
End With
' задаем параметры винсока

' загружаем еще 10 элементов винсока, т.к. max_sessions = 11 (-1)
For i = 1 To MAX_SESSIONS
Load wsk(i)
wsk(i).Protocol = sckTCPProtocol
wsk(i).LocalPort = WSK_LOCAL_PORT
Next
UpdateStatus
End Sub

Private Sub lbClearList_Click()
lstMessages.Clear
End Sub

Private Sub LocalIPServer_Click()
Dim i As Integer
MsgBox wsk(i).LocalIP, , "IP"
End Sub

Private Sub mnuFileExit_Click()
Unload Me
End Sub

Private Sub tmrTimer_Timer()
UpdateStatus
End Sub

Private Sub wsk_Close(Index As Integer)
UpdateStatus
End Sub

Private Sub wsk_Connect(Index As Integer)
UpdateStatus
End Sub

Private Sub wsk_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim msg As String
Dim i As Integer
' если это прослушивающий порт (index=0) then....
If Index = 0 Then
' ищем открытый сеанс
For i = 1 To MAX_SESSIONS
With wsk(i)
If .State = sckClosed Then
' подключится к сеансу
.Accept requestID
Exit For
End If
End With
Next
End If
End Sub

Private Sub wsk_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim msg As String
Dim i As Integer

' получить сообщение и занести его всписок
wsk(Index).GetData msg, , bytesTotal
lstMessages.AddItem msg

' передать сообщение другим клиентам
For i = 1 To MAX_SESSIONS ' max_session = 10
    If wsk(i).State = sckConnected Then
    ' передать сообщение текущему клиенту
        wsk(i).SendData msg
            ' подождать, пока сообщение будет доставлено
    DoEvents
    End If
Next
'End If
End Sub




------------Клиент-------------
Form1

Код: Выделить всё
Option Explicit

Private Sub Form_Load()
txtRx.Enabled = False
txtTx.Enabled = False
txtName.Enabled = False
End Sub


Private Sub Label3_Click()
frmIPconfig.Show
txtName.Enabled = True
End Sub


Private Sub lbBlue_Click()
With txtTx
.ForeColor = vbBlue
End With
End Sub

Private Sub Label4_Click()
frmRisovalka.Show
End Sub

Private Sub txtName_KeyPress(KeyAscii As Integer)
If (KeyAscii = 13) And (txtName.Text <> "") Then
txtName.Enabled = False
txtRx.Enabled = True
txtTx.Enabled = True
txtTx.SetFocus

'Clientname = txtName.Text
'wsk(2).SendData Clientname

End If
End Sub


Private Sub txtTx_KeyPress(KeyAscii As Integer)
Dim myTime As String
myTime = Time
Dim msg As String

' когда юзер нажимает Enter
If (KeyAscii = 13) And (txtTx.Text = "") Then
MsgBox "Не введен текст!", , "Ошибка"

' когда юзер нажимает Enter и текст. окно не пустое
ElseIf (KeyAscii = 13) And (wsk([b]0[/b]).State = sckConnected) Then

' включит в сообщение текущее время и имя отправителя
msg = UCase$(myTime) & " " & "[" & Trim$(txtName.Text) & "]- " & txtTx.Text

' отправляем сообщение
wsk([b]0[/b]).SendData msg

' очищаем текстовое окно
txtTx.Text = ""
End If
End Sub

Private Sub wsk_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim msg As String
' получить сообщение из буфера
wsk([b]0[/b]).GetData msg, , bytesTotal
' вывести его в текстовом окне
With txtRx
.Text = msg & vbCrLf & .Text
End With
End Sub



frmIpConfig

Код: Выделить всё
Option Explicit

Private Sub Label4_Click()
Dim IPAdress1
IPAdress1 = txtIPAdress.Text
' подключаемся к серверу

With Form1.wsk(0)
.Protocol = sckTCPProtocol
.RemoteHost = IPAdress1
.RemotePort = 12345
.Connect
End With

'Dim i As Integer
'For i = 1 To 3
'Load Form1.wsk(i)
'Next

'With Form1.wsk(1)
'.Protocol = sckTCPProtocol
'.RemoteHost = IPAdress1
'.RemotePort = 12346
'.Connect
'End With

IPAdress = IPAdress1
Unload Me
End Sub

Private Sub txtIPAdress_KeyPress(KeyAscii As Integer)
If (KeyAscii = 13) And (txtIPAdress.Text <> "") Then Label4_Click
End Sub


Проблема в том, что я пытаюсь создать массив винсоков:
Код: Выделить всё
'Dim i As Integer
'For i = 1 To 3
'Load Form1.wsk(i)
'Next


затем прирубить его к порту 12346:

Код: Выделить всё
'With Form1.wsk(1)
'.Protocol = sckTCPProtocol
'.RemoteHost = IPAdress1
'.RemotePort = 12346
'.Connect
'End With


и работать как бы на 2 портах 12345 и 12346
т.е. по порту 12345 отсылаются просто сообщения а по 12346 отсылаются имена пользователя.

И вообщем ничего неработает :(((

Жду Help!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.06.2005 (Вт) 22:32

А если у тебя придёт большое сообщение (>8Кб), то оно "как бы" разобьётся на много. Тебя это не смущает? ;-)


Если серьёзно - перестань страдать фигнёй, одного порта тебе вполне достаточно. Задай своим "сообщениям" какую-нибудь структуру, и передавай текст и автора вместе.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 29

    TopList