没有合适的资源?快使用搜索试试~ 我知道了~
首页C#socket同步异步机制
C#socket同步异步机制
5星 · 超过95%的资源 需积分: 50 24 下载量 185 浏览量
更新于2023-03-16
评论
收藏 742KB PDF 举报
本文详细的总结了 C#.net同步异步SOCKET通讯和多线程,并以问答的形式解释了socket异步的实现机制
资源详情
资源评论
资源推荐
谁给我解释一下 C# socket 异步的实现机制?
悬赏分:
50 |
解决时间:
2010-1-3 14:06 |
提问者:
zhou0996
1.调用 beginsend 之后,是马上执行 sendCallback 回调,还是发送完成了执行?
2.调用 beginReceive()之后,一收到数据就执行 ReceiveCallback 回调,还是缓冲
区满了时,还是收到数据缓冲区未满超过某个时间执行回调?
3.发送完成之后是客户端最后一次调用 beginSend()之后发送端关闭 socket 先,
还是接收端收到最后一次数据,然后接收端关闭 socket 先再轮到发送端关闭
socket?
最后,如果有 C# socket 异步传输文件的例子就最好啦,先感谢下好心人~~!
最佳答案
1.发送完了执行。(假设你要发送一个很大的文件,要分好几次发送,第一次还
没发完就回调了,在回调函数中再来第二次发送不就出异常了)。
2.数据接收完毕或者缓冲区满了时。(如果没有数据发过来,这个线程会一直挂
起,没有“超过某个时间就回调”的说法)。
3.数据发送完毕和关闭 Socket 有什么联系呢,数据发送完了,Socket 连接还在呀,
除非你调用了 Socket.ShutDown(SocketShutdown.Both)时就不能收发数据了,
Socket.Close()才会关闭 Socket,Socket 的关闭是由你来控制的。
例子:(随便写了几句代码,给你加点注释)
int i;
int size = 1024;
byte buffer = new byte[size];
//读文件
FileStream fs =new FileStream(filename,FileMode.Open,FileAccess.Read);
//将文件转化成二进制流(不然怎么传)
BinaryReader br = new BinaryReader(fs);
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
//连接对方主机的 ip 地址和侦听端口
sock.Connect(ip, port);
//将文件的二进制流读入缓冲区
br.Read(buffer, 0, size);
//将缓冲区的内容异步发送出去,委托回调函数 EndSendFile()在后面
sock.BeginSend(buffer, 0, size, SocketFlags.None,
new AsyncCallback(EndSendFile), null);
private void EndSendFile(IAsyncResult AR)
{
//结束挂起的异步发送
sock.EndSend(AR);
//判断文件是否读完,没读完继续读到缓冲区
if ((i = br.Read(buffer, 0, size)) != 0)
{
//发送缓冲区内容,你看清楚回调函数(就是本函数)
//就是说这次发送完后又调用这个函数来判断和发送
sock.BeginSend(buffer, 0, size, SocketFlags.None,
new AsyncCallback(EndSendFile), null);
}
}
这是我随便写的几句代码,不过我以前都实践过的,应该是对的,你想运行它的
话,还要自己加点东西,还要写个接收程序(异步接收的话就用你说的
BeginReceive()试一试)。
C#.net 同步异步 SOCKET 通讯和多线程总结
同步套接字通信
Socket 支持下的网上点对点的通信
服务端实现监听连接,客户端实现发送连接请求,建立连接后进行发送和接收数据的功能
服务器端建立一个 socket,设置好本机的 ip 和监听的端口与 socket 进行绑定,开始监听连
接请求,当接收到连接请求后,发送确认,同客户端建立连接,开始与客户端进行通信。
客户端建立一个 socket,设置好服务器端的 IP 和提供服务的端口,发出连接请求,接收到
服务的确认后,尽力连接,开始与服务器进行通信。
服务器端和客户端的连接及它们之间的数据传送均采用同步方式。
Socket
Socket 是 tcp\ip 网络协议接口。内部定义了许多的函数和例程。可以看成是网络通信的一个
端点。在网络通信中需要两个主机或两个进程。通过网络传递数据,程序在网络对话的每一
端需要一个 socket。
Tcp/IP 传输层使用协议端口将数据传送给一个主机的特定应用程序,协议端口是一个应
用程序的进程地址。传输层模块的网络软件模块要于另一个程序通信,它将使用协议端口,
socket 是运行在传输层的 api,使用 socket 建立连接发送数据要指定一个端口给它。
Socket:
Stream Socket 流套接字 Socket 提供双向、有序、无重复的数据流服务,出溜大量的网络数
据。
Dgram socket 数据包套接字 支持双向数据流,不保证传输的可靠性、有序、无重复。
Row socket 原始套接字 访问底层协议
建立 socket 用 C#
命名空间:using System.Net;using System.Net.Socket;
构造新的 socket 对象:socket 原型:
Public socket (AddressFamily addressFamily,SocketType sockettype,ProtocolType protocolType)
AddressFamily 用来指定 socket 解析地址的寻址方案。Inte.Network 标示需要 ip 版本 4 的地
址,Inte.NetworkV6 需要 ip 版本 6 的地址
SocketType 参数指定 socket 类型 Raw 支持基础传输协议访问,Stream 支持可靠,双向,基
于连接的数据流。
ProtocolType 表示 socket 支持的网络协议
定义主机对象:
IPEndPoint 类:IPEndPoint 构造方法 位置:System.Net
原型:1) public IPEndPoint(IPAddress address,int port) 2)public IPEndPoint(long address,int
port) 参数 1 整型 int64 如 123456,参数 2 端口 int32
主机解析:
利用 DNS 服务器解析主机,使用 Dns.Resolve 方法
原型:public static IPHostEntry Resolve(string hostname) 参数:待解析的主机名称,返回
IPHostEntry 类值,IPHostEntry 为 Inte.Net 主机地址信息提供容器,该容器提供存有 IP 地址
列表,主机名称等。
Dns.GetHostByName 获取本地主机名称
原型:public static IPHostEntry GetHostByName(string hostname)
GetHostByAddress
原型:1)public static IPHostEntry GetHostByAddress(IPAddress address) 参数:IP 地址 2)public
static IPHostEntry GetHostByAddress(string address) IP 地址格式化字符串
端口绑定和监听:
同步套接字服务器主机的绑定和端口监听
Socket 类的 Bind(绑定主机),Listen(监听端口),Accept(接收客户端的连接请求)
Bind:原型:public void Bind(EndPoint LocalEP)参数为主机对象 IPEndPoint
Listen:原型:public void Listen(int backlog) 参数整型数值,挂起队列最大值
accept:原型:public socket accept() 返回为套接字对象
演示程序:
IPAddress myip=IPAddress.Parse(“127.0.0.1”);
IPEndPoint myserver=new IPEndPoint(myip,2020);
Socket sock=new Socket(AddressFamily.Inte.Network,SocketType.Stream,ProtocolType.Tcp);
Sock.Bind(myserver);
Sock.Listen(50);
Socket bbb=sock.Accept();
发送数据:方法 1:socket 类的 send 方法二.NetworkStream 类 Write
send 原型:public int Send(byte[] buffer) 字节数组
public int Send(byte[],SocketFlags)原型 2 说明,SocketFlags 成员列表:DontRoute(不使用路由
表发送),MaxIOVectorLength(为发送和接收数据的 wsabuf 结构数量提供标准值)None 不对
次调用使用标志) OutOfBand(消息的部分发送或接收)Partial(消息的部分发送或接收)
Peek(查看传入的消息)
原型三:public int Send(byte[],int,SocketFlags) 参数二要发送的字节数
原型四:public int Send(byte[],int,int,SocketFlags) 参数二为 Byte[]中开始发送的位置
演示:
Socket bbb=sock.Accept();
Byte[] bytes=new Byte[64];
string send="aaaaaaaaaaaa";
bytes=System.Text.Encoding.BigEndianUnicode.GetBytes(send.ToCharArray());
bbb.Send(bytes,bytes.length,0);//将 byte 数组全部发送
.NetWordStream 类的 Write 方法发送数据
原型:public override void write(byte[] buffer,int offset,int size) 字节数组,开始字节位置,总
字节数
Socket bbb=sock.Accept();
.NetWorkStream stre=new NewWorkStream(bbb);
Byte[] ccc=new Byte[512];
string sendmessage="aaaaaaaaaaaaaa";
ccc=System.Text.Encoding.BigEndianUnicode.GetBytes(sendmessage);
stre.Write(ccc,0,ccc.length);
接收数据:Socket 类 Receive.NetworkStream 类 Read
Socket 类 Receive 方法
原型:public int Receive(byte[] buffer)
2)public int Receive(byte[],SocketFlags)
3)public int Receive(byte[],int,SocketFlags)
4)public int Receive(byte[],int,int,SocketFlags)
剩余43页未读,继续阅读
xiaolong36
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- stc12c5a60s2 例程
- Android通过全局变量传递数据
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1