socket api写的UDP通信协议例子例子无法接收。求教!

shizheng0909 2008-12-22 06:50:03
一个UDP通信的简单例子却怎么也搞不定。
通信双方都再同一机器上。
服务端(且叫服务端)使用的是win socket控件,通过UDP协议进行端口监视,如果接收到数据则可以跳转到_DataArrival事件中。
客户端若使用win Socket控件编写,则服务端接收正常。可若使用API调用进行编写问题就来了,客户端调用sendto后,返回正常,即发送的字节数。可服务端就是不能触发_DataArrival事件,也就无法接收数据。非常郁闷!服务端的程序很简单如下:
'--------------------------------------
Private Sub Form_Load()'绑定端口
sockserver.LocalPort = CInt("5555")
sockserver.Bind CInt("5555")
End Sub
' 当客户向服务器发送数据到达后 , 产生DataArrival事件
Private Sub SockServer_DataArrival(ByVal bytesTotal As Long)
Dim s As String
sockserver.GetData s
debug.Print CStr(s)
End Sub
'---------------------sockserver是控件的名称。-------------


客户端程序如下,每次调用完sendto后,返回正常,可服务端就是不能触发接收事件。还望高人指教。在下倍感荣幸!
'---------客户端MOD.bas-------

Option Explicit
'Winsock Initialization and termination
Public Declare Function WSAStartup Lib "ws2_32.dll" (ByVal wVR As Long, lpWSAD As WSAData) As Long
Public Declare Function WSACleanup Lib "ws2_32.dll" () As Long
'Network byte ordering functions
Public Declare Function htons Lib "ws2_32.dll" (ByVal hostshort As Integer) As Integer
Public Declare Function htonl Lib "ws2_32.dll" (ByVal hostlong As Long) As Long
'Hostname resolving functions
Public Declare Function inet_addr Lib "ws2_32.dll" (ByVal cp As String) As Long
Public Declare Function Socket Lib "ws2_32.dll" Alias "socket" (ByVal af As Long, ByVal s_type As Long, ByVal Protocol As Long) As Long
Public Declare Function WSACloseSocket Lib "ws2_32.dll" Alias "closesocket" (ByVal s As Long) As Long
Public Declare Function sendto Lib "ws2_32.dll " (ByVal s As Long, ByVal buf As String, ByVal lLen As Long, ByVal flags As Long, ByRef to1 As sockaddr, ByVal tolen As Long) As Long

Private Const WSADESCRIPTION_LEN = 257
Private Const WSASYS_STATUS_LEN = 129
Public Const ERROR_SUCCESS = 0&
'Winsock Data structure
Public Type WSAData
wVersion As Integer 'Version
wHighVersion As Integer 'High Version
szDescription As String * WSADESCRIPTION_LEN 'Description
szSystemStatus As String * WSASYS_STATUS_LEN 'Status of system
iMaxSockets As Integer 'Maximum number of sockets allowed
iMaxUdpDg As Integer 'Maximum UDP datagrams
lpVendorInfo As Long 'Vendor Info
End Type
'Socket Address structure
Public Type sockaddr
sin_family As Integer
sin_zero As String * 8
sin_addr As Long
sin_port As Integer
End Type

'Basic Winsock error results.
Public Enum WSABaseErrors
INADDR_NONE = &HFFFF
SOCKET_ERROR = -1
INVALID_SOCKET = -1
End Enum
Public Const SOCK_STREAM = 1 'Stream socket
Public Const SOCK_DGRAM = 2
'Address family
Public Const AF_INET = 2 'Internetwork: UDP, TCP, etc.

'Socket Protocol
Public Const IPPROTO_TCP = 6 'tcp
Public Const OFFSET_2 = 65536
Public Const MAXINT_2 = 32767
Public s As Long

'---------------------客户端程序Form1.frm------------
Option Explicit

Private Sub Form_Load()

Dim WSAInfo As WSAData
Dim ret As Long
Dim addr As sockaddr
Dim arrBuffer() As Byte
Dim str As String
str = "test"
If WSAStartup(&H202, WSAInfo) <> ERROR_SUCCESS Then
debug.print "err"
Exit Sub
End If
s = Socket(AF_INET, SOCK_DGRAM, 0)
If s = INVALID_SOCKET Then
debug.print "err"
Exit Sub
End If

addr.sin_family = AF_INET
addr.sin_port = htons(5555)
addr.sin_addr = inet_addr("127.0.0.1")
addr.sin_zero = vbNullString

ret = sendto(s, str, Len(str), 0, addr, Len(addr))
If ret = SOCKET_ERROR Then
Debug.Print "err"
End If

WSACloseSocket s
Call WSACleanup
End Sub
...全文
225 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shizheng0909 2009-01-05
  • 打赏
  • 举报
回复
楼上的兄弟谢谢!
可就当前代码,有大侠能给出答案么
tzwsoho 2009-01-04
  • 打赏
  • 举报
回复
http://download.csdn.net/source/214505
Winsock API VB 教程
shizheng0909 2008-12-25
  • 打赏
  • 举报
回复
难道就没有高手路过赐教一下么。
yurengang 2008-12-23
  • 打赏
  • 举报
回复
ding
wap21 2008-12-22
  • 打赏
  • 举报
回复
ding
shizheng0909 2008-12-22
  • 打赏
  • 举报
回复
求教啊

1,486

社区成员

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

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