最近才开始看C# 中socket的部分,花了点时间学习,总算对socket 基于tcp协议的链接方式有了点点了解,记录下来:
native和metro AP 建立链接的话,使用native当服务器,metro做client
native端使用C# 创建server。
//使用异步的方式建立监听:
// Socket client;
Socket server;
SocketAsyncEventArgs sockAsyncEvent = new SocketAsyncEventArgs();
private void startServer()
{
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Any, int.Parse("22552")));
server.Listen(1);
sockAsyncEvent.Completed += new EventHandler<SocketAsyncEventArgs>(ProcessAccept);
server.AcceptAsync(sockAsyncEvent);
}
//当链接建立之后会调用以下函数:
// AsyncCallback
void ProcessAccept(object sender, SocketAsyncEventArgs e)
{
Socket client = e.AcceptSocket;
e.AcceptSocket = null;
int bufferSize = 4;
var args = new SocketAsyncEventArgs();
args.Completed += new EventHandler<SocketAsyncEventArgs>(OnIOCompleted);//使用异步的方法进行接受数据
args.SetBuffer(new byte[bufferSize], 0, bufferSize);
args.AcceptSocket = client;
if (!client.ReceiveAsync(args))
this.ProcessReceive(args);
server.AcceptAsync(sockAsyncEvent);
}
void OnIOCompleted(object sender, SocketAsyncEventArgs e) //当接受到数据之后会调用以下函数
{
switch (e.LastOperation)
{
case SocketAsyncOperation.Receive:
this.ProcessReceive(e);
break;
case SocketAsyncOperation.Send:
this.ProcessSend(e);
break;
default:
throw new ArgumentException("The last operation completed on the socket was not a receive or send");
}
}
void ProcessReceive(SocketAsyncEventArgs e)
{
Socket client = e.AcceptSocket;
if (e.BytesTransferred > 0)
{
if (e.SocketError == SocketError.Success)
{
byte flag = e.Buffer[0];
if (flag == 0xff)
{
Byte[] sendBuffer = Encoding.ASCII.GetBytes("I have receiver the request " + flag);
Byte[] sendlen = BitConverter.GetBytes(sendBuffer.Length);
e.AcceptSocket.Send(sendlen);
e.AcceptSocket.Send(sendBuffer);
}
if (flag == 0xfe)
{
// Code
Byte[] getStringLen = new Byte[4];
int received = e.AcceptSocket.Receive(getStringLen);// get length of the string
int len = BitConverter.ToInt32(getStringLen, 0);
Byte[] getStringData = new Byte[len];
received = e.AcceptSocket.Receive(getStringData); //get the real data of the string
//
}
e.AcceptSocket.ReceiveAsync(e);
}
}
else
{
//receive 0 byte; maybe socket is closed
int x = 0;
e.AcceptSocket.Shutdown(SocketShutdown.Both);
e.AcceptSocket.Close();
}
}
metro 主要是使用streamsocket 以下建立链接并接收数据
private async void GetLargeData()
{
HostName host = new HostName("127.0.0.1");
streamsocket = new StreamSocket();
try
{
await streamsocket.ConnectAsync(host, "22552", SocketProtectionLevel.PlainSocket);
Byte[] flag = new Byte[4];
flag[0] = 0xff;
sendData(flag);
DataReader serverReader = new Windows.Storage.Streams.DataReader(streamsocket.InputStream);
await serverReader.LoadAsync(4);
serverReader.ReadBytes(flag);
int len = BitConverter.ToInt32(flag,0);
byte[] content = new byte[len];
await serverReader.LoadAsync((uint)len);
serverReader.ReadBytes(content);
Byte value = content[len - 1];
string sss = System.Text.Encoding.UTF8.GetString(content, 0, len);
}
catch (Exception e)
{
int x = 0;
}
// getDataValue(len);
}