用winsock.pbl开发UDP通信略解------PowerBuilder

 

一、需要准备的外部文件:
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是自定义窗口函数,显示一些提示信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值