1 开发了一个通讯工具,用的是udp协议,每次才传输完一个文件后,内存会不断增大,发送多少就增大多少,关闭socket后,内存无法释放。
2 为了找到问题,我们把所有的系统设置都取消,就剩下一个sendto(lb_blob,len(lb_blob),0,userver_ip,ii_port),lb_blob字段设置为1k,循环1000次后内存占用就涨近100M,然后关闭对话窗口(传输的套接字是在对话窗口声明的,跟主窗口无关),内存还是无法释放,只有关闭主窗口。
3 用的是winsocket.pbl
UDP 通信
------解决方案--------------------
不要用winsocket.pbl,直接winsock控件就行了
pb中建立一对一的连接的方法很简单,比方说吧:
1、新建一个winsock的应用程序对象;
2、新建窗口server,在server中添加winsock控件ole_winsck;
3、新建窗口client,在client中也添加winsock控件ole_winsck;
4、在server和client的winsock控件的事件中填写代码:
在nectionrequest事件中写:
if ole_winsck.object.state<>0 then
ole_winsck.object.close()
end if
ole_winsck.object.accept(requestid)
messagebox("",string(requestid))
在dataarrival事件中写:
messagebox("提示","收到")
5、在server的open事件中写代码:
if isvalid(ole_winsck) = false then return -1
ii_localport=2001
//winsock通讯协议设为TCP协议
ole_winsck.object.protocol=0
//本地侦听的winsock通讯端口号
ole_winsck.object.localport=20001//
ole_winsck.object.listen()
6、在client的open事件中写代码:
if isvalid(ole_winsck) = false then return -1
//winsock通讯协议设为TCP协议
ole_winsck.object.protocol=0
//server的ip地址
ole_winsck.object.remotehost="132.113.64.202"
//server的winsock通讯端口号
ole_winsck.object.remoteport=20001
ole_winsck.object.connect()
6、在server的机上首先运行server窗口,进行侦听;
7、在client的机上运行client窗口进行连接;
如果想发送数据的话,就分别在两个窗口上添加一个send按钮,在send按钮的click事件中添加代码:
string as_data="好玩呀"
if ole_winsck.object.state = 7 then
ole_winsck.object.senddata(as_data)
MessageBox("提示","通知通信控制系统成功!",Information!)
return 1
else
MessageBox("警告","通知通信控制系统失败!",StopSign!)
return -1
end if
在SERVER 端收到一个accept()后,需打开一个
新的WINSOCK事件(即需调用新的WINSCOK控件)
成功后,该WINSCOK控件与CLIENT对话,原WINSCOK控件
继续进行监听,如果有新的连接要求,则产生
一个accept()后,又打开一个新的WINSOCK事件
这样,就实现一个SERVER 端对多个CLIENT对话,
也能实现CLIENT间对话(通过SERVER 端的转接)
------解决方案--------------------
试一下在socket 对象的方法 sendto (blob buf, integer len, integer flags, unsignedlong uladdr, integer iport) 的
iRet = s.wssendto(socknum,lb_blob,len,flags,ulAddr,iPort)
后写上: setnull(lb_blob)