今天发两篇socket的贴(无奈结贴为了再发贴有分),这次希望各位帮下忙回答下

yunhaiC QQ654777694 2011-05-13 03:22:07

Private Sub Winsock1_DataArrival(ByVal eventSender As System.Object, ByVal eventArgs As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles Winsock1.DataArrival
Dim mbytes() As Byte
Dim tempZahl As Integer
ReDim mbytes(eventArgs.bytesTotal)

'data arrived from a client

'copy data into the mbyte buffer
Call Winsock1.GetData(mbytes, VariantType.Byte, eventArgs.bytesTotal)



private void axWinsock1_DataArrival(object sender, AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent e)
{
Byte[] mbytes = new Byte[e.bytesTotal];
axWinsock1.GetData(ref mbytes, typeof(Byte), e.bytesTotal);


}

这是用的MSSocket控件在DataArrival事件里面写的一样的代码。我本意是想转成C#,但是GetData这个方法却很奇怪,在VB里面第一个参数接受数组,在C#里面却不能传数组,只能传ref object data。不解,所以特来求解
希望各位大侠要帮我下
...全文
290 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
archkoven 2012-07-06
  • 打赏
  • 举报
回复
我这里有遗留的代码,这样写通过了,但是为什么type是8,已经无从考证了。希望对你有帮助。

Byte[] byteData = new Byte[512];
Object oMaxLen = byteData.Length;
Object oData = (Object)byteData;
Object oType = 8;

objWinsock.GetData(ref oData, oType, oMaxLen);

如果以后有人能搞定这个原因,请勿吝啬将答案在此告知。
qldsrx 2011-05-14
  • 打赏
  • 举报
回复
额,昨天上不了网来,现在来看居然结了,难道你解决了?
我感觉是你的axWinsock没有连接,首先需要知道你这个是服务端使用的还是客户端使用的,如果是客户端和服务端在一起,得创建2个才行。如果不连接,那个事件是不会触发的。
  • 打赏
  • 举报
回复
后来我又把axWinsock1.GetData(ref mbytes, typeof(Byte[]), 16);
改成了axWinsock1.GetData(ref mbytes);虽然没有报错,但是iNum依旧是0,不解啊
  • 打赏
  • 举报
回复
我刚在Send我的数据后面这样写
send(cmd);

object mbytes = new Byte[16];

int iNum = axWinsock1.BytesReceived;

try
{
axWinsock1.GetData(ref mbytes, typeof(Byte[]), 16);
}
catch (Exception ex)
{
ex.ToString();
}

iNum返回的是0,然后报错。
System.Runtime.InteropServices.COMException (0x800A9C52): 异常来自 HRESULT:0x800A9C52
在 MSWinsockLib.IMSWinsockControl.GetData(Object& data, Object type, Object maxLen)
在 AxMSWinsockLib.AxWinsock.GetData(Object& data, Object type, Object maxLen)
在 PLCSendRecv.Form1.Write2PLC(Byte[] data1, Byte[] data2)
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 qldsrx 的回复:]
你确定是没触发?也许是在抓取数据的时候没有处理好呢。你可以单独设置一个按钮,按下接收数据看看,如果数据来了不接收,只要不溢出,肯定还在缓存中。有个BytesReceived属性也可以看有多少数据在缓存中。
[/Quote]
我把程序挂起在axWinsock1_DataArrival事件上的,发送过数据以后,没有数据返回到挂起的位置。
你的意思是我要用GetData()自己抓数据,不要放在事件里面?
qldsrx 2011-05-13
  • 打赏
  • 举报
回复
你确定是没触发?也许是在抓取数据的时候没有处理好呢。你可以单独设置一个按钮,按下接收数据看看,如果数据来了不接收,只要不溢出,肯定还在缓存中。有个BytesReceived属性也可以看有多少数据在缓存中。
  • 打赏
  • 举报
回复
我刚试验过了,在VB里面axWinsock1_DataArrival触发没问题,axWinsock1_DataArrival在C#里面有的时候居然不触发,崩溃崩溃
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 qldsrx 的回复:]
试试这样写,语法上是通过的,理论上没有问题,你看看实际接收数据是否正常。

C# code

private void axWinsock1_DataArrival(object sender, AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent e)
{
object ……
[/Quote]
这个方法可以,完全符合需求。
现在居然又碰到另外的问题,axWinsock1_DataArrival这个事件在VB里面触发没问题,在.net里面居然有的时候不触发,太郁闷了
孤独的行者牛 2011-05-13
  • 打赏
  • 举报
回复
string ReceiveData = "".PadLeft(50,' ');
axWinsock1.GetData(ref ReceiveData, Type.GetType("string"), 50);
qldsrx 2011-05-13
  • 打赏
  • 举报
回复
试试这样写,语法上是通过的,理论上没有问题,你看看实际接收数据是否正常。

private void axWinsock1_DataArrival(object sender, AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent e)
{
object mbytes = new Byte[e.bytesTotal];
axWinsock1.GetData(ref mbytes, typeof(Byte[]), e.bytesTotal);
}
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qldsrx 的回复:]
引用 6 楼 yunhaic 的回复:
在工具栏----选择项目---com元件--Mircrosoft WinSock Control,version 6.0

我没那个COM组件啊,所以才问你要下载,我用的是VS2008,WIN2003系统。
[/Quote]
http://download.csdn.net/source/3276276
我上传到CSDN下载中心了,不要积分
qldsrx 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yunhaic 的回复:]
在工具栏----选择项目---com元件--Mircrosoft WinSock Control,version 6.0
[/Quote]
我没那个COM组件啊,所以才问你要下载,我用的是VS2008,WIN2003系统。
  • 打赏
  • 举报
回复
再其次,C# 本身 System.Net.Sockets 里面封装的TcpListener TcpClient 很好用,为什么不用
回答见2楼
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bduren 的回复:]
再补充一下,人个意见:VB的那种写法,也是有问题的,定义了mbytes() 根本就没有分配空间,传进去可能会造成系统异常!
[/Quote]
首先,mbytes是分配空间了的,麻烦看清楚代码,谢谢!ReDim mbytes(eventArgs.bytesTotal)
其次,你传入一个 IntPtr 试试
錯誤 5 引數 '1': 無法從 'ref System.IntPtr' 轉換為 'ref object' C:\Documents and Settings\Administrator\桌面\PlcClient\PlcClient\Form1.cs 556 36 PlcClient

孤独的行者牛 2011-05-13
  • 打赏
  • 举报
回复
再补充一下,人个意见:VB的那种写法,也是有问题的,定义了mbytes() 根本就没有分配空间,传进去可能会造成系统异常!
孤独的行者牛 2011-05-13
  • 打赏
  • 举报
回复
呵呵,C# 本身 System.Net.Sockets 里面封装的TcpListener TcpClient 很好用,为什么不用
还有,在VB里,传数组,是因为需要传入地址吧?
谁告诉你只能传入 ref object data ???
你传入一个 IntPtr 试试
没测试,但知道你的方法肯定不行!
即然来问问题,就虚心一点……
不看看自己写的啥玩意!
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qldsrx 的回复:]
那个控件哪里有下载?看不到接口没法确定和调试。
[/Quote]
在工具栏----选择项目---com元件--Mircrosoft WinSock Control,version 6.0
qldsrx 2011-05-13
  • 打赏
  • 举报
回复
那个控件哪里有下载?看不到接口没法确定和调试。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bduren 的回复:]
居然还有这样写Socket的,无语……
[/Quote]
无语什么,弄懂问题了没?不要乱无语
孤独的行者牛 2011-05-13
  • 打赏
  • 举报
回复
居然还有这样写Socket的,无语……
加载更多回复(2)

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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