winsock多机通信问题!!!!

年糕 2003-11-04 11:12:24
一个服务器端,n个客户端,怎样让服务器端对应向连接的客户端发送数据?
比如现在n台客户端已经连接到服务器端,我想要向第10台发数据,(这其中的客户端IP有可能相同)!就象聊天室中的私聊一样!
...全文
86 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxgsb 2003-11-05
  • 打赏
  • 举报
回复
???
???
???
yxgsb 2003-11-05
  • 打赏
  • 举报
回复
用 IP 值做为 WinSock 控件数组索引值,再按索引值,也就是 IP 发送数据!
Gelim 2003-11-05
  • 打赏
  • 举报
回复
接上面
客户端的主窗体的主要程序:
Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
Private Const WM_SYSCOMMAND = &H112
Private Const SC_RESTORE = &HF120&


Private Sub cmdConnect_Click()
On Error GoTo cmdConnect_Click_Error
With objTCP
.RemotePort = 1001
.RemoteHost = Me.txtRemoteComputer.Text
.Connect
End With

cmdConnect_Click_Exit:
Exit Sub

cmdConnect_Click_Error:
MsgBox "Unable to connect to remote server!", vbInformation, "Remote Computer Explorer!"
objTCP.Close
Exit Sub

End Sub


Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next

With frmMain
.tvTreeView.Nodes.Clear
.lvFiles.ListItems.Clear
End With

End Sub

Private Sub objTCP_Connect()
On Error GoTo objTCP_Connect_Error
With frmMain
.tvTreeView.Nodes.Add , , "xxxROOTxxx", txtRemoteComputer.Text, "RC", "RC"
.tbToolbar.Buttons("DISCONNECT").Enabled = True
.tbToolbar.Buttons("CONNECT").Enabled = False
End With

objTCP.SendData "|ENUMDRVS|"
Me.Visible = False

objTCP_Connect_Exit:
Exit Sub

objTCP_Connect_Error:
MsgBox Err.Description, vbCritical, "Remote Computer Explorer!"
Exit Sub

End Sub


Private Sub txtRemoteComputer_Change()
On Error GoTo txtRemoteComputer_Change_Error

If Len(txtRemoteComputer.Text) <> 0 Then
cmdConnect.Enabled = True
Else
cmdConnect.Enabled = False
End If

txtRemoteComputer_Change_Exit:
Exit Sub

txtRemoteComputer_Change_Error:
MsgBox Err.Description, vbCritical, "Remote Computer Explorer!"
Exit Sub

End Sub

Private Sub cmdCancel_Click()
On Error Resume Next
Unload Me
End Sub

Private Sub objTCP_DataArrival(ByVal bytesTotal As Long)
On Error GoTo objTCP_DataArrival_Error
Dim myStr As String
Dim Strdata() As Byte

objTCP.GetData Strdata, vbByte
myStr = StrConv(Strdata, vbUnicode)

If InStr(1, myStr, "|MESSAGE|") <> 0 Then
Dim a As String
Dim b As String
Beep
a = Mid$(myStr, 10, Len(myStr)) + Chr$(&HD) + Chr$(&HA)
b = objTCP.RemoteHostIP & " ?????μ£o"
Dim ffile As Integer
ffile = FreeFile
Open frmMain.Message_Recorder_FileName For Append As ffile
Print #ffile, Now & " " & b
Print #ffile, a
Close ffile

Dim myHwnd As Long
myHwnd = FindWindow(vbNullString, "Message")
If myHwnd = 0 Then
frmMessage.Txt_Receive = b & a & Chr$(13) & Chr$(10)
frmMessage.Show
Else
frmMessage.Txt_Receive = frmMessage.Txt_Receive & b & a & Chr$(13) & Chr$(10)
If frmMessage.Txt_Rec.Visible = True Then
frmMessage.Txt_Rec = frmMessage.Txt_Rec & Now & " " & b & Chr$(13) & Chr$(10) & a & Chr$(13) & Chr$(10)
frmMessage.Txt_Rec.SelStart = Len(frmMessage.Txt_Rec)
End If
SendMessage myHwnd, WM_SYSCOMMAND, SC_RESTORE, ByVal 0&
SetForegroundWindow (myHwnd)
End If

If Len(frmMessage.Txt_Receive) > 1000 Then frmMessage.Txt_Receive = ""
frmMessage.Txt_Receive.SelStart = Len(frmMessage.Txt_Receive)

End If


objTCP_DataArrival_Exit:
Exit Sub

objTCP_DataArrival_Error:
bGettingDesktop = False
MsgBox Err.Description, vbCritical, "Remote Computer Explorer!"
Exit Sub


End Sub
Gelim 2003-11-05
  • 打赏
  • 举报
回复
使用winsock.以下代码希望能报到你。有问题请使用消息联系!

服务器端主窗体主要程序:

Private Sub Form_Load()

On Error GoTo Form_Load_Error
StartAtWindowsStart IIf(right$(App.Path, 1) = "\", _
App.Path, App.Path & "\") & App.EXEName & ".exe", Start_Run, LM_Start

Message_Recorder_FileName = App.Path + "\smessage.txt"
intmax = 0

Is_FILESEND = False
myFreeFile = 0

objTCP(intmax).LocalPort = 1001
objTCP(intmax).Listen
Me.Hide
Form_Load_Exit:
Exit Sub

Form_Load_Error:
MsgBox Err.Description, vbCritical, "Error!"
Exit Sub

End Sub

Private Sub objTCP_Close(Index As Integer)

On Error GoTo objTCP_Close_Error

objTCP(intmax).Close

objTCP_Close_Exit:
Exit Sub

objTCP_Close_Error:
MsgBox Err.Description, vbCritical, "Error!"
Exit Sub

End Sub


Private Sub objTCP_ConnectionRequest(Index As Integer, ByVal requestID As Long)
'关键是有1个客户端连接过来就添加一个winsock,此处使用了控件数组
On Error GoTo objTCP_ConnectionRequest_Error
If Index = 0 Then
intmax = intmax + 1
Load objTCP(intmax)
objTCP(intmax).LocalPort = 0
objTCP(intmax).Accept requestID
objTCP(intmax).SendData Enum_Drives
End If

objTCP_ConnectionRequest_Exit:
Exit Sub

objTCP_ConnectionRequest_Error:
MsgBox Err.Description, vbCritical, "Error!"
Exit Sub

End Sub

Private Sub objTCP_DataArrival(Index As Integer, ByVal bytesTotal As Long)

On Error GoTo objTCP_DataArrival_Error

Dim strData As String
Dim iCommand As Integer
Dim sData As String
Dim lRet As Long
Dim DataByte() As Byte
objTCP(intmax).GetData DataByte
strData = StrConv(DataByte, vbUnicode)

If InStr(1, strData, "|MESSAGE|") <> 0 Then
sData = Mid$(strData, 10, Len(strData)) + Chr$(&HD) + Chr$(&HA)
Beep
Dim ffile As Integer
Dim s1 As String

s1 = objTCP(intmax).RemoteHostIP & "?????μ£o"
ffile = FreeFile
Open Message_Recorder_FileName For Append As ffile
Print #ffile, Now & " " & s1
Print #ffile, sData
Close ffile

Dim myHwnd As Long
myHwnd = FindWindow(vbNullString, "Network Message!")

If myHwnd = 0 Then
frmMessage.txtMessage = s1 & sData & Chr$(13) & Chr$(10)
frmMessage.Show
Else
frmMessage.txtMessage = frmMessage.txtMessage & s1 & sData & Chr$(13) & Chr$(10)
If frmMessage.Txt_Rec.Visible = True Then
frmMessage.Txt_Rec = frmMessage.Txt_Rec & Now & " " & s1 & Chr$(13) & Chr$(10) & sData & Chr$(13) & Chr$(10)
frmMessage.Txt_Rec.SelStart = Len(frmMessage.Txt_Rec)
End If

DelSysTrayIcon

frmMessage.Show
frmMessage.WindowState = vbNormal
SetForegroundWindow (myHwnd)
End If

If Len(frmMessage.txtMessage) > 1000 Then frmMessage.txtMessage = ""
frmMessage.txtMessage.SelStart = Len(frmMessage.txtMessage)

End If


objTCP_DataArrival_Exit:
Exit Sub

objTCP_DataArrival_Error:
MsgBox Err.Description, vbCritical, "Error!"
Exit Sub

End Sub
Gelim 2003-11-05
  • 打赏
  • 举报
回复
ʹÓÃwinsock.ÒÔÏ´úÂëÏ£ÍûÄܱ¨µ½Äã¡£ÓÐÎÊÌâÇëʹÓÃÏûÏ¢ÁªÏµ£¡

·þÎñÆ÷¶ËÖ÷´°ÌåÖ÷Òª³ÌÐò£º

Private Sub Form_Load()

On Error GoTo Form_Load_Error
StartAtWindowsStart IIf(right$(App.Path, 1) = "\", _
App.Path, App.Path & "\") & App.EXEName & ".exe", Start_Run, LM_Start

Message_Recorder_FileName = App.Path + "\smessage.txt"
intmax = 0

Is_FILESEND = False
myFreeFile = 0

objTCP(intmax).LocalPort = 1001
objTCP(intmax).Listen
Me.Hide
Form_Load_Exit:
Exit Sub

Form_Load_Error:
MsgBox Err.Description, vbCritical, "Error!"
Exit Sub

End Sub

Private Sub objTCP_Close(Index As Integer)

On Error GoTo objTCP_Close_Error

objTCP(intmax).Close

objTCP_Close_Exit:
Exit Sub

objTCP_Close_Error:
MsgBox Err.Description, vbCritical, "Error!"
Exit Sub

End Sub


Private Sub objTCP_ConnectionRequest(Index As Integer, ByVal requestID As Long)
'¹Ø¼üÊÇÓÐ1¸ö¿Í»§¶ËÁ¬½Ó¹ýÀ´¾ÍÌí¼ÓÒ»¸öwinsock£¬´Ë´¦Ê¹ÓÃÁ˿ؼþÊý×é
On Error GoTo objTCP_ConnectionRequest_Error
If Index = 0 Then
intmax = intmax + 1
Load objTCP(intmax)
objTCP(intmax).LocalPort = 0
objTCP(intmax).Accept requestID
objTCP(intmax).SendData Enum_Drives
End If

objTCP_ConnectionRequest_Exit:
Exit Sub

objTCP_ConnectionRequest_Error:
MsgBox Err.Description, vbCritical, "Error!"
Exit Sub

End Sub

Private Sub objTCP_DataArrival(Index As Integer, ByVal bytesTotal As Long)

On Error GoTo objTCP_DataArrival_Error

Dim strData As String
Dim iCommand As Integer
Dim sData As String
Dim lRet As Long
Dim DataByte() As Byte
objTCP(intmax).GetData DataByte
strData = StrConv(DataByte, vbUnicode)

If InStr(1, strData, "|MESSAGE|") <> 0 Then
sData = Mid$(strData, 10, Len(strData)) + Chr$(&HD) + Chr$(&HA)
Beep
Dim ffile As Integer
Dim s1 As String

s1 = objTCP(intmax).RemoteHostIP & "?????¦Ì¡êo"
ffile = FreeFile
Open Message_Recorder_FileName For Append As ffile
Print #ffile, Now & " " & s1
Print #ffile, sData
Close ffile

Dim myHwnd As Long
myHwnd = FindWindow(vbNullString, "Network Message!")

If myHwnd = 0 Then
frmMessage.txtMessage = s1 & sData & Chr$(13) & Chr$(10)
frmMessage.Show
Else
frmMessage.txtMessage = frmMessage.txtMessage & s1 & sData & Chr$(13) & Chr$(10)
If frmMessage.Txt_Rec.Visible = True Then
frmMessage.Txt_Rec = frmMessage.Txt_Rec & Now & " " & s1 & Chr$(13) & Chr$(10) & sData & Chr$(13) & Chr$(10)
frmMessage.Txt_Rec.SelStart = Len(frmMessage.Txt_Rec)
End If

DelSysTrayIcon

frmMessage.Show
frmMessage.WindowState = vbNormal
SetForegroundWindow (myHwnd)
End If

If Len(frmMessage.txtMessage) > 1000 Then frmMessage.txtMessage = ""
frmMessage.txtMessage.SelStart = Len(frmMessage.txtMessage)

End If


objTCP_DataArrival_Exit:
Exit Sub

objTCP_DataArrival_Error:
MsgBox Err.Description, vbCritical, "Error!"
Exit Sub

End Sub
一、WinSock简介 Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的网络通信应用程序接口之一。20世纪90年代初,由Sun Microsystems,JSB,FTP software,Microdyne和Microsoft等几家公司共同定制了一套标准,即Windows Socket规范,简称WinSock。 VB编写网络程序主要有两种方式:1.winsock控件 2.winsockAPI 二、WinSock控件的使用 1.WinSock控件的主要属性 LocalHostName属性 本地机器名 LocalIP属性 本地机器IP地址 LocalPort属性 本地机器通信程序的端口(0<端口<65536) RemoteHost属性 远程机器名 RemotePort属性 远程机器的通信程序端口 Protocol属性 通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP对应的VB的常量分别是sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是TCP。注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。 SocketHandle属性 返回当前socket连接的句柄,这是只读属性。 RemoteHostIP属性 属性返回远程计算机的IP地址。在客户端,当使用了控件的Connect方法后,远程计算机的IP地址就赋给了RemoteHostIP属性,而在服务器端,当ConnectRequest事件后,远程计算机(客户端)的IP地址就赋给了这个属性。如果使用的是UDP协议那么当DataArrival事件后,发送UDP报文的计算机的IP才赋给了这个属性。 ByteReceived属性 返回当前接收缓冲区中的字节数 State属性 返回WinSock控件当前的状态 常数 值 描述 sckClosed 0 缺省值,关闭。 SckOpen 1 打开。 SckListening 2 侦听 sckConnectionPending 3 连接挂起 sckResolvingHost 4 识别主机。 sckHostResolved 5 已识别主机 sckConnecting 6 正在连接。 sckConnected 7 已连接。 sckClosing 8 同级人员正在关闭连接。 sckError 9   错误 2.WinSock主要方法 Listen方法 方法用于服务器程序,等待客户访问。格式:Winsock对象.listen Connect方法 用于向远程主机发出连接请求。格式:Winsock对象.connect [远程主机IP,远程端口] Accept方法 用于接受一个连接请求。格式:Winsock对象.accept Request ID Senddata方法 用于发送数据。格式:Winsock对象.senddata 数据 Getdata方法 用来取得接收到的数据。格式:Winsock对象.getdata 变量 [,数据类型 [,最大长度]] Close方法 关闭当前连接。格式:Winsock对象.close Bind方法 用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。 Listen方法Listen方法只在使用TCP协议时有用。它将应用程序置于监听检测状态。 Connect方法 当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。Connect方法调用的规范为:Connect RemoteHost,RemotePort Accept方法 当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。 SendData方法当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。 GetData方法 当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData方法。GetData方法调用规范如下:GetData

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧