用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是自定义窗口函数,显示一些提示信息。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的C-MEX函数示例,用于实现UDP通信: ```matlab #include "mex.h" #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { // 初始化Winsock库 WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { mexErrMsgIdAndTxt("MATLAB:udp_communication:error", "WSAStartup failed: %d", iResult); return; } // 创建UDP套接字 SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock == INVALID_SOCKET) { mexErrMsgIdAndTxt("MATLAB:udp_communication:error", "socket failed: %d", WSAGetLastError()); WSACleanup(); return; } // 设置套接字选项 int timeout = 1000; // 1秒超时 setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof(timeout)); // 解析目标地址 char *dest_ip_str = mxArrayToString(prhs[0]); unsigned short dest_port = mxGetScalar(prhs[1]); struct sockaddr_in dest_addr; dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(dest_port); dest_addr.sin_addr.s_addr = inet_addr(dest_ip_str); // 发送数据 char *send_buf = mxArrayToString(prhs[2]); int send_len = mxGetNumberOfElements(prhs[2]); int send_result = sendto(sock, send_buf, send_len, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr)); if (send_result == SOCKET_ERROR) { mexErrMsgIdAndTxt("MATLAB:udp_communication:error", "sendto failed: %d", WSAGetLastError()); closesocket(sock); WSACleanup(); return; } // 接收数据 char recv_buf[1024]; int recv_len; struct sockaddr_in src_addr; int src_addr_len = sizeof(src_addr); recv_len = recvfrom(sock, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&src_addr, &src_addr_len); if (recv_len == SOCKET_ERROR) { mexErrMsgIdAndTxt("MATLAB:udp_communication:error", "recvfrom failed: %d", WSAGetLastError()); closesocket(sock); WSACleanup(); return; } // 构造输出参数 plhs[0] = mxCreateString(recv_buf); // 关闭套接字 closesocket(sock); // 清理Winsock库 WSACleanup(); } ``` 该函数接受三个输入参数:目标IP地址、目标端口号和发送数据;输出一个字符串类型的接收数据。调用示例: ```matlab ip_addr = '192.168.1.100'; port = 12345; send_data = 'Hello, World!'; recv_data = udp_communication(ip_addr, port, send_data); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值