最近学习要求做网络编程,使用从网上找了一些资料,主要是网络协议的分层等通讯,你可以查看英文版的资料:CScharp网络编程英文版

下面直接给出代码吧,我想一看应该就懂。

TCP Client 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text; namespace TcpLib
{
public class TcpClient
{ public TcpClient()
{
mSAEA.SetBuffer(new byte[ * ], , * );
mSAEA.Completed += Receive_Completed;
} private bool mConnected = false; private Socket mSocket; private Exception mLastError; private SocketAsyncEventArgs mSAEA = new SocketAsyncEventArgs(); public void DisConnect()
{
mConnected = false;
try
{
if (mSocket != null)
{
mSocket.Close(); }
}
catch
{
}
mSocket = null;
} private void Receive_Completed(object sender, SocketAsyncEventArgs e)
{
try
{
if (e.SocketError == SocketError.Success && e.BytesTransferred > )
{
TcpReceiveArgs tra = new TcpReceiveArgs();
tra.Data = e.Buffer;
tra.Offset = ;
tra.Count = e.BytesTransferred;
OnReceive(tra);
}
else
{
mLastError = new SocketException((int)e.SocketError);
DisConnect();
}
}
catch (Exception e_)
{
mLastError = e_;
}
finally
{
BeginReceive();
}
} private void BeginReceive()
{
try
{ if (!mSocket.ReceiveAsync(mSAEA))
{
Receive_Completed(this, mSAEA);
}
}
catch (Exception e_)
{
DisConnect();
mLastError = e_;
} } protected virtual void OnReceive(TcpReceiveArgs e)
{
e.Client = this;
if (Receive != null)
Receive(this, e);
} public event EventHandler<TcpReceiveArgs> Receive; public Exception LastError
{
get
{
return mLastError;
}
} public Socket Socket
{
get
{
return mSocket;
} } public bool Connected
{
get
{
return mConnected;
}
} public void Connect(string host, int port)
{
IPAddress[] ips = Dns.GetHostAddresses(host);
if(ips.Length ==)
throw new Exception("get host's IPAddress error");
var address = ips[];
try
{
mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
mSocket.Connect(address, port);
mConnected = true;
BeginReceive();
}
catch (Exception e_)
{
DisConnect();
mLastError = e_;
throw e_;
}
} public void Send(string value)
{
Send(value, Encoding.UTF8);
} public void Send(string value, Encoding coding)
{
Send(coding.GetBytes(value));
} public void Send(byte[] data)
{
Send(data, , data.Length);
} public void Send(byte[] data, int offset, int count)
{
try
{ while (count > )
{
int sends = mSocket.Send(data, offset, count, SocketFlags.None);
count -= sends;
offset += sends;
}
}
catch (Exception e_)
{
DisConnect();
mLastError = e_;
throw e_;
}
} public void Send(ArraySegment<byte> data)
{
Send(data.Array, data.Offset, data.Count); } } public class TcpReceiveArgs : EventArgs
{
public TcpClient Client
{
get;
internal set;
} public byte[] Data
{
get;
internal set;
} public int Offset
{
get;
internal set;
} public int Count
{
get;
internal set;
} public byte[] ToArray()
{
byte[] result = new byte[Count];
Buffer.BlockCopy(Data, Offset, result, , Count);
return result;
} public void CopyTo(byte[] data, int start = )
{
Buffer.BlockCopy(Data, Offset, data, start, Count);
}
} }

UDP Client 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace UdpLib
{
public class UdpClient
{
public UdpClient(string host, int port)
{
mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
if (string.IsNullOrEmpty(host))
mSocket.Bind(new IPEndPoint(IPAddress.Any, port));
else
mSocket.Bind(new IPEndPoint(IPAddress.Parse(host), port));
mReceiveSAEA.Completed += OnReceiveCompleted;
mReceiveSAEA.SetBuffer(new byte[ * ], , * );
BeginReceive();
} private Exception mLastError; private SocketAsyncEventArgs mReceiveSAEA = new SocketAsyncEventArgs(); private Socket mSocket; private void OnReceiveCompleted(object sender, SocketAsyncEventArgs e)
{
try
{
if (e.SocketError == SocketError.Success && e.BytesTransferred > )
{
UdpReceiveArgs ura = new UdpReceiveArgs();
ura.EndPoint = e.RemoteEndPoint;
ura.Data = e.Buffer;
ura.Offset = ;
ura.Count = e.BytesTransferred;
OnReceive(ura);
}
}
catch (Exception e_)
{
mLastError = e_;
}
finally
{ BeginReceive();
}
} private void BeginReceive()
{
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, ); mReceiveSAEA.RemoteEndPoint = endpoint;
if (!mSocket.ReceiveFromAsync(mReceiveSAEA))
{
OnReceiveCompleted(this, mReceiveSAEA);
}
} protected virtual void OnReceive(UdpReceiveArgs e)
{
if (Receive != null)
Receive(this, e);
} public Exception LastError
{
get
{
return mLastError;
}
} public void Send(string data, string host, int port)
{
Send(data, new IPEndPoint(IPAddress.Parse(host), port));
} public void Send(byte[] data, string host, int port)
{
Send(data, new IPEndPoint(IPAddress.Parse(host), port));
} public void Send(byte[] data, EndPoint point)
{
Send(data, , data.Length, point);
}
public void Send(byte[] data,int offset,int count, EndPoint point)
{
while (count > )
{
int sends = mSocket.SendTo(data, offset, count, SocketFlags.None, point);
count -= sends;
offset += sends;
}
}
public void Send(string data, EndPoint point)
{
Send(Encoding.UTF8.GetBytes(data), point);
} public event EventHandler<UdpReceiveArgs> Receive; } public class UdpReceiveArgs : EventArgs
{ public EndPoint EndPoint
{
get;
internal set;
} public byte[] Data
{
get;
internal set;
} public int Offset
{
get;
internal set;
} public int Count
{
get;
internal set;
}
public byte[] ToArray()
{
byte[] result = new byte[Count];
Buffer.BlockCopy(Data, Offset, result, , Count);
return result;
} public void CopyTo(byte[] data, int start = )
{
Buffer.BlockCopy(Data, Offset, data, start, Count);
}
} }

TCP和UDP Client 代码的更多相关文章

  1. Linux 下socket通信终极指南(附TCP、UDP完整代码)

    linux下用socket通信,有TCP.UDP两种协议,网上的很多教程把两个混在了一起,或者只讲其中一种.现在我把自己这两天研究的成果汇总下来,写了一个完整的,适合初学者参考,也方便自己以后查阅. ...

  2. 初识-----基于Socket的UDP和TCP编程及测试代码

    一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流 ...

  3. UDP client,UDP server, TCP server, TCP client

    UDP server import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocke ...

  4. TCP/UDP Socket调试工具提供了TCP Server,TCP Client,UDP Server,UDP Client,UDP Group 五种Socket调试方案。

    一.TCP通信测试: 1)   创建TCP Server: 选中左方的TCP Server, 然后点击”创建”按钮,软件弹出监听端口输入框 输入监听端口后,即创建了一个在指定端口上进行监听的TCP S ...

  5. [转]VB Winsock 控件TCP与UDP连接实例

    [-] 可能的用途 选择通讯协议 协议的设置 确定计算机的名称 TCP 连接初步 接受多个连接请求 UDP 初步 关于 Bind 方法   利用 WinSock 控件可以与远程计算机建立连接,并通过用 ...

  6. Linux网络编程8——对TCP与UDP的简易封装

    引言 每次使用socket通信,都会有很对相似的操作.本文,会对TCP与UDP通信做一简单封装,并生成动态库. 代码 my_socket.h #ifndef __MY_SOCKET_H__ #defi ...

  7. Android开发:如何实现TCP和UDP传输

    TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控制协 ...

  8. 高性能 TCP &amp; UDP 通信框架 HP-Socket v3.2.3 正式宣布

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包括服务端组件.client组件和 Agent 组件.广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#. ...

  9. 高性能 TCP &amp; UDP 通信框架 HP-Socket v3.2.2 正式公布

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包括服务端组件.client组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#. ...

随机推荐

  1. 工具推荐. 在线unix, 在线python/perl脚本测试环境

    在线python, perl, javascript, Lisp, Ruby等  http://melpon.org/wandbox/ 正则表达式在线测试工具 http://tools.jb51.ne ...

  2. HUE配置文件hue.ini 的zookeeper模块详解(图文详解)(分HA集群)

    不多说,直接上干货! 我的集群机器情况是 bigdatamaster(192.168.80.10).bigdataslave1(192.168.80.11)和bigdataslave2(192.168 ...

  3. 5700刀打造3卡1080Ti深度学习机器【转】

    本文转载自:https://www.jianshu.com/p/ca2e003bf77e   5700美刀,打造3x1080Ti实验室GPU深度学习机器 最近为公司搭建了一台实验用的深度学习主机,在网 ...

  4. UVa 10054 项链(欧拉回路)

    https://vjudge.net/problem/UVA-10054 题意:有一种由彩色珠子连接成的项链.每个珠子的两半由不同颜色组成.相邻两个珠子在接触的地方颜色相同.现在有一些零碎的珠子,需要 ...

  5. Adapter Class/Object(适配器)

    意图: 将一个类的接口转换成客户希望的另外一个接口.Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适用性: 你想使用一个已经存在的类,而它的接口不符合你的需求. 你想 ...

  6. 《图解Http》 2-6章: 基础,报文,状态码,首部。

    HTTP协议和Cookie 是stateless协议,自身不对请求和响应之间的通信状态进行保存.但随着技术发展,为了实现保存状态的功能,引入了Cookie技术. Cookie在请求和响应报文中写入信息 ...

  7. linux挂载windows共享文件夹出错,提示mount error(13): Permission denied

    完整的可以工作的命令行: mount -v -t cifs -o username=clouder,password=123456,iocharset=utf8,sec=ntlm //172.28.1 ...

  8. Curious Array CodeForces - 407C (高阶差分)

    高阶差分板子题 const int N = 1e5+111; int a[N], n, m, k; int C[N][111], d[N][111]; signed main() { scanf(&q ...

  9. 《BAT前端进阶[师徒班]》学习总结

    这是一个培训课 是的,这是一个面向中级前端的培训班,但明显跟传统的填鸭式培训班不太一样.这边的老师都是大牛这是毫无疑问的,而且都是一线开发人员.而且课程一开始就说明了面向了是有1-3年有工作经验的前端 ...

  10. Spring MVC中使用Swagger生成API文档和完整项目示例Demo,swagger-server-api(二十)

    一:Swagger介绍 Swagger是当前最好用的Restful API文档生成的开源项目,通过swagger-spring项目 实现了与SpingMVC框架的无缝集成功能,方便生成spring r ...