一、需要准备的外部文件:
1、winsock.pbl
在开发环境中使用的库文件
2、PSLIB21.DLL
对应winsock和pb环境版本的动态库文件
二、定义全局变量
winsock ws //所有的api可以通过这个对象来调用。
socketdgram s //UDP协议的通讯使用socketdgram,TCP的使用socketstream
boolean islisten = false //程序是否已开始监听来自远端的通信
三、初始化winsock
在开始监听以前必须首先初始化ws
ws = create winsock
四、开始监听
wf_connect(boolean startListen)
//开始及结束监听的自定义窗口函数
//startListen
//true:开始在定义的端口上监听
//false:结束监听
ulong ulAddr
string sHostName
pbhostent heTmp
integer aEvents
if startListen = true then
if islisten = false then
if isnumber(em_localport.text) and integer(em_localport.text) > 0 then
iport = integer(em_localport.text)
else
return
end if
if isvalid(s) then destroy s
s = create socketdgram
sHostName = space(64)
ws.gethostname(sHostName,len(sHostName)) //用ws的方法得到本机名称
heTmp=ws.gethostbyname(sHostName) //用本机名称得到本机的地址信息
if isnull(heTmp) = FALSE then
ulAddr = heTmp.h_addr_list[1]
//得到的本机地址在h_addr_list数组中,一般只有一个地址,可以直接用下标1来得到
//注意,此地址是一个无符号长整型数,不是四段的字符串
s.bind(ulAddr,iport) //将socketdgram绑定到本机的地址和端口
aEvents = ws.FD_READ
s.wsaasyncselect( handle(this), 1024, aEvents)
//将收到到信息的事件绑定到主窗口的自定义事件上,事件ID是pbm_custom01
else
wf_msg('在端口' + string(iport) + '开始监听时失败!')
return
end if
end if
elseif startListen = false then
if islisten = true then
if isvalid(s) then
s.closesocket()
destroy s
END IF
end if
end if
五、为窗口定义自定义事件,事件ID是pbm_custom01,事件名称任意,此处为ue_socket()
//当socket有消息到达时,会触发此窗口事件(在前面已经绑定此事件)
//在此事件中处理接受的消息。
int iLen
long li_pos
ulong ulAddr
string ls_hostname
iEvent = ws.WSAGetSelectEvent(message.longparm)
choose case iEvent
case ws.FD_READ
blobBuf = blob(space(1024))
iLen = s.recvfrom(blobBuf,len(blobBuf),0,ulAddr,li_Port)
//接收信息,信息的长度为iLen,来源地址为ulAddr,来源端口为li_Port
//信息内容放在blob变量blobbuf中。
if iLen = ws.SOCKET_ERROR then
wf_msg('接收信息失败!')
else
ls_hostname = ws.inet_ntoa(ulAddr)
//得到字符串型的对方IP地址
blobbuf = blobmid(blobbuf,1,ilen)
//得到完整的信息内容
//可继续处理信息,如直接显示,可用string函数将blobbuff直接转换成string型变量。
end if
end choose
六、向目标发送消息
int li_port
int iLen
blob blobbuf,lb_crc
string ls_data
string ls_remote
string ls_remoteport
pbhostent tmpHostent
ls_data = mle_msg.text //消息内容
mle_msg.text = ''
ls_remote = sle_remote.text //目标IP
ls_remoteport = em_remoteport.text //目标端口
if isnumber(ls_remoteport) and len(trim(ls_data)) > 0 then
tmpHostent = ws.GetHostByName(ls_remote)
if IsNull(tmpHostent) then
wf_msg( '未找到主机' + ls_remote + '!')
return
end if
li_port = integer(ls_remoteport)
blobbuf = blob(ls_data)
//将要发送的消息放入blob变量blobbuf,或进行其他处理,但最后要放在blob变量中
iLen = s.sendto(blobbuf,len(blobbuf),0, tmpHostent.h_addr_list[1],li_port)
if iLen = ws.SOCKET_ERROR then
wf_msg('向' + ls_remote + '发送消息失败!')
else
wf_msg('向' + ls_remote + '发送消息:' + ls_data)
end if
end if
七、wf_msg是自定义窗口函数,显示一些提示信息。