📄 obexlistenercontext.cs
字号:
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using bluetoothX;
namespace bluetoothX
{
public class ObexListenerContext
{
byte[] buffer;
private Socket socket;
private ObexListenerRequest request;
private WebHeaderCollection headers = new WebHeaderCollection();
private MemoryStream bodyStream = new MemoryStream();
private EndPoint localEndPoint;
private EndPoint remoteEndPoint;
short remoteMaxPacket = 0;
internal ObexListenerContext(Socket s)
{
buffer = new byte[0x2000];
this.socket = s;
this.localEndPoint = s.LocalEndPoint;
this.remoteEndPoint = s.RemoteEndPoint;
bool moretoreceive = true;
while(moretoreceive)
{
int received = 0;
try
{
received = s.Receive(buffer,3,SocketFlags.None);
}
catch(SocketException se)
{
Console.Write(se.Message);
}
if(received == 3)
{
ObexMethod method = (ObexMethod)buffer[0];
short len = (short)(IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, 1)) - 3);
if(len > 0)
{
int iPos = 0;
while (iPos < len)
{
int receivedBytes = s.Receive(this.buffer, iPos+3, s.Available, SocketFlags.None);
iPos += receivedBytes;
}
}
byte[] responsePacket = null;
switch(method)
{
case ObexMethod.Get:
ObexParser.ParseHeaders(buffer, ref remoteMaxPacket, bodyStream, headers);
responsePacket = new byte[3] {(byte)ObexStatusCode.MethodNotAllowed, 0x00, 0x03};
break;
case ObexMethod.Connect:
ObexParser.ParseHeaders(buffer, ref remoteMaxPacket, bodyStream, headers);
responsePacket = new byte[7] { 0xA0, 0x00, 0x07, 0x10, 0x00, 0x20, 0x00 };
break;
case ObexMethod.Put:
ObexParser.ParseHeaders(buffer, ref remoteMaxPacket, bodyStream, headers);
responsePacket = new byte[3] {(byte)(ObexStatusCode.Continue | ObexStatusCode.Final), 0x00, 0x03};
break;
case ObexMethod.PutFinal:
ObexParser.ParseHeaders(buffer, ref remoteMaxPacket, bodyStream, headers);
responsePacket = new byte[3] { (byte)(ObexStatusCode.OK | ObexStatusCode.Final), 0x00, 0x03 };
break;
case ObexMethod.Disconnect:
ObexParser.ParseHeaders(buffer, ref remoteMaxPacket, bodyStream, headers);
responsePacket = new byte[3] {(byte)(ObexStatusCode.OK | ObexStatusCode.Final), 0x00, 0x03};
moretoreceive = false;
break;
default:
Console.WriteLine(method.ToString() + " " + received.ToString());
break;
}
try
{
if(responsePacket!=null)
{
s.Send(responsePacket);
}
}
catch(Exception se)
{
Console.WriteLine(se.Message);
}
}
else
{
moretoreceive = false;
}
}
s.Close();
s = null;
request = new ObexListenerRequest(bodyStream.ToArray(), headers, localEndPoint, remoteEndPoint);
}
public ObexListenerRequest Request
{
get
{
return request;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -