[新人求解]关于socket异步调用
private void AsyncConnect(IPAddress host, uint port)
{
try
{
GameUtils.Logger.Net.Log("AsyncConnect:"+host+" port:"+port);
lock(lockObj)
{
if (clientSocket == null)
{
clientSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
clientSocket.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.Linger,
new LingerOption(false, 0));
clientSocket.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveBuffer,
NetOptions.SOCKET_MAX_RECV_SIZE);
clientSocket.ReceiveTimeout = NetOptions.Timeout;
clientSocket.SendTimeout = NetOptions.Timeout;
}
clientSocket.BeginConnect(
new IPEndPoint(host, (int)port),
new AsyncCallback(connectCallback),
clientSocket
);
}
}
catch (Exception exception)
{
GameUtils.Logger.Net.LogException(exception);
}
}
---------------------------------------------------------------------
private void connectCallback(IAsyncResult asyncConnect)
{
Socket socket = (Socket)asyncConnect.AsyncState;
if (socket == null)
{
return;
}
try
{
socket.EndConnect(asyncConnect);
if (asyncConnect.IsCompleted && socket.Connected)
{
PushInternalMsg(Packet.enInternalMsgType.Connected);
BeginReceive(socket);
}
}
catch (SocketException e)
{
GameUtils.Logger.Net.Log(e.Message);
OnSocketDisconnect();
}
catch (Exception e)
{
GameUtils.Logger.Net.Log(e.Message);
}
}
-----------------------------------------------
private void BeginReceive(Socket socket)
{
try
{
if (!socket.Connected)
{
return;
}
socket.BeginReceive(
_byteRecvBuffer,
_recvBufferSize,
NetOptions.SOCKET_MAX_RECV_SIZE - _recvBufferSize,
SocketFlags.None,
//new AsyncCallback(receiveCallback),
receiveCallback,
clientSocket
);
}
catch (Exception e)
{
GameUtils.Logger.Net.Log(e.Message);
OnSocketDisconnect();
}
}
---------------------------------
private void receiveCallback(IAsyncResult ar)
{
try
{
var socket = (Socket)ar.AsyncState;
if (!ar.IsCompleted || socket == null || socket.Connected == false)
{
return;
}
int length = socket.EndReceive(ar); //在IOS上面这行报错 operation on non-blocking socket would block
if (length == 0)
{
OnSocketDisconnect();
return;
}
_recvBufferSize = _recvBufferSize + length;
//
_lastRecvTime = (uint)System.Environment.TickCount;
//Split
while (true)
{
Packet packet = _packetBuilder.FromBytes(_byteRecvBuffer, _recvBufferSize,true);
if (packet == null)
{
BeginReceive(socket);
return;
}
else
{
_recvBufferSize = _recvBufferSize - (int)packet.Size;
Buffer.BlockCopy(_byteRecvBuffer, (int)packet.Size, _byteRecvBuffer, 0, _recvBufferSize);
_recvPacketCount++;
lock (((ICollection)_packetlist).SyncRoot)
{
_packetlist.Add(packet);
}
}
}
}
catch (SocketException e)
{
GameUtils.Logger.Net.Log(e.Message);
OnSocketDisconnect();
}
catch (Exception e)
{
GameUtils.Logger.Net.Log(e.Message);
}
}