问个小问题,我发誓绝对简单

手抓宝 2010-09-15 09:22:35
关于从Socket获取数据的问题,

服务端:

private static void OnRecievedData(IAsyncResult ar)
{
SocketCoderClient client = (SocketCoderClient)ar.AsyncState;

IList<ArraySegment<byte>> list=new List<ArraySegment<byte>>();

byte[] aryRet = client.GetRecievedData(ar);
ArraySegment<byte> arrByte = new ArraySegment<byte>(aryRet);

list.Add(arrByte);

//.......省略N步

//有一个客户端列表ClientsList,List<SocketCoderClient>类型
//这里的目的是向每个客户端发送所有客户端的数据
foreach(SocketCoderClient scc in ClientsList)
{
//判断等省略
clientSend.ReadOnlySocket.Send(aryRet);
}
}


这里的Send方法用的是如下重载:

// 摘要:
// 将列表中的一组缓冲区发送到连接的 System.Net.Sockets.Socket。
//
// 参数:
// buffers:
// System.Byte 类型的 System.ArraySegment<T> 的列表,它包含要发送的数据。
//
// 返回结果:
// 已发送到 System.Net.Sockets.Socket 的字节数。
//
// 异常:
// System.ArgumentNullException:
// buffers 为 null。
//
// System.ArgumentException:
// buffers 为空。
//
// System.Net.Sockets.SocketException:
// 试图访问套接字时发生错误。请参见下面的备注部分。
//
// System.ObjectDisposedException:
// System.Net.Sockets.Socket 已关闭。
public int Send(IList<ArraySegment<byte>> buffers);



客户端:

Socket client_socket;

byte[] response = new byte[150000];
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.Completed += OnReceiveCompleted;
socketEventArg.SetBuffer(response, 0, response.Length); //问题貌似出在这里
client_socket.ReceiveAsync(socketEventArg);


protected void OnReceiveCompleted(object sender, SocketAsyncEventArgs e)
{
this.Dispatcher.BeginInvoke(new mydelegate(xxxxxxxxx), e.BufferList); //这里接收到的不对劲了
}


现在的问题是:
我在服务端发送的是一个IList<ArraySegment<byte>>,但是在客户端SocketAsyncEventArgs只有e.Buffer
而e.BufferList为Null,我想是因为在socketEventArg.SetBuffer(response, 0, response.Length);这里出现了问题,
应该不能直接向一个byte[]中SetBuffer。
SetBuffer的重载里也没有向List中写的方法

请问我应该如何做才能够从服务端接收到BufferList,也就是接收到服务端返回的IList<ArraySegment<byte>>???
...全文
603 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
请求时候如果用bufferlist 请求 那么接受数据也只能用bufferlist buffer 对应buffer bufferlist 对应 bufferlist buffer和bufferlist只能同时存在一个
kfwgisfi 2010-09-17
  • 打赏
  • 举报
回复
代码太多,没兴趣啊
Adechen 2010-09-16
  • 打赏
  • 举报
回复
实在不简单,socket不懂呀
Dream83619 2010-09-16
  • 打赏
  • 举报
回复
ReceiveAsync这个函数我没用过,但我理解arg.BufferList是客户端投递的缓冲区,是客户端预先分配好的,和Receive(byte[] bytes) 中的bytes一样,不用和服务端的数据完全匹配。
用ReceiveAsync这个函数我有个疑问,如果是TCP的话,能保证Completed事件中接收到的是完整的数据包吗?


gaven2060 2010-09-16
  • 打赏
  • 举报
回复
嘿嘿 一个帖子看出很多人不会通讯方面的
哎 我也不会 顶一下
Bodil 2010-09-16
  • 打赏
  • 举报
回复
手抓宝 2010-09-16
  • 打赏
  • 举报
回复
自己再顶一下,20楼大哥,你跑哪儿去了?
arg.BufferList = new List<ArraySegment<byte>>() {
new ArraySegment<byte>(new byte[1]),
new ArraySegment<byte>(new byte[1]),
new ArraySegment<byte>(new byte[1]),
new ArraySegment<byte>(new byte[1])
};

客户端没法确定有多少人在连服务端,所以这里BufferList初始化的数量应该怎么去弄?
如果我自己连的话,new一个ArraySegment好使,如果俩人连new一个就出错了,new多了又影响效率,怎么办怎么办???
xu_diligent 2010-09-16
  • 打赏
  • 举报
回复
简单学习!
手抓宝 2010-09-16
  • 打赏
  • 举报
回复
啊,屮,看错了。。。
我看的Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\System.Net.dll
手抓宝 2010-09-16
  • 打赏
  • 举报
回复
你的ProtocolType里有UDP?System.Net.Sockets的ProtocolType?有UDP?
Dream83619 2010-09-16
  • 打赏
  • 举报
回复
// tcp
Socket socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// udp
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

个人认为数据量不大的时候用udp比较好
手抓宝 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 dream83619 的回复:]
用ReceiveAsync这个函数我有个疑问,如果是TCP的话,能保证Completed事件中接收到的是完整的数据包吗?
[/Quote]
目前我接到的还都是完整的。
另外,Socket是不是只能用TCP?
public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);
就这一个构造函数
public enum ProtocolType
{
// 摘要:
// 未知的协议类型。
Unknown = -1,
//
// 摘要:
// 未指定协议类型。
Unspecified = 0,
//
// 摘要:
// 传输控制协议 (TCP)。
Tcp = 6,
}

ProtocolType也只有TCP 貌似没有UDP这样的东西。。
pdsnet 2010-09-15
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 qdwangle 的回复:]

这么简单的问题不好意思回答...呵呵!!(不懂....)
帮顶...
[/Quote]+1
村长_乐 2010-09-15
  • 打赏
  • 举报
回复
这么简单的问题不好意思回答...呵呵!!(不懂....)
帮顶...
lilin8905 2010-09-15
  • 打赏
  • 举报
回复
even0220 2010-09-15
  • 打赏
  • 举报
回复
-,-楼主大清早忽悠我。
手抓宝 2010-09-15
  • 打赏
  • 举报
回复
对不起,有一个地方写错了,修改一下,免得误导大家
clientSend.ReadOnlySocket.Send(aryRet);
=》
clientSend.ReadOnlySocket.Send(list);
懦芞 2010-09-15
  • 打赏
  • 举报
回复
Socket没有解除过,帮顶
lchy110 2010-09-15
  • 打赏
  • 举报
回复
水平有限。。看来简单的问题也解决不了 惭愧。。。
MSDNXGH 2010-09-15
  • 打赏
  • 举报
回复
只等接分。。。
加载更多回复(22)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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