- 아래는 server의 session.cs 코드입니다.
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace ServerCore
{
class Session
{
Socket _socket;
int _disconnected = 0;
public void Start(Socket socket)
{
_socket = socket;
SocketAsyncEventArgs recvArgs = new SocketAsyncEventArgs();
recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnRecvCompleted);
//userTocken으로 추가적인 정보를 아무거나넘겨줄 수 있다(object를 받기 때문)
recvArgs.SetBuffer(new byte[1024],0,1024);
RegisterRecv(recvArgs);
}
public void Send(byte[] sendBuff)
{
_socket.Send(sendBuff);
}
public void Disconnect()
{
if(Interlocked.Exchange(ref _disconnected, 1) == 1)
{
return;
}
_socket.Shutdown(SocketShutdown.Both);
//쫓아낸다
_socket.Close();
}
#region 네트워크 통신
void RegisterRecv(SocketAsyncEventArgs args)
{
args.AcceptSocket = null;
bool pending = _socket.ReceiveAsync(args);
//바로 성공했으면
if(pending == false)
{
OnRecvCompleted(null, args);
}
}
void OnRecvCompleted(object obj, SocketAsyncEventArgs args)
{
//BytesTransferred == 몇바이트 받았는지
if (args.BytesTransferred > 0 && args.SocketError == SocketError.Success)
{
try
{
string recvData = Encoding.UTF8.GetString(args.Buffer, args.Offset, args.BytesTransferred);
Console.WriteLine($"[from client] : {recvData}");
RegisterRecv(args);
}
catch (Exception e)
{
Console.WriteLine($"onrecvcompleted failed {e}");
}
}
else
{
Disconnect();
}
}
#endregion
}
}
여기서,
recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnRecvCompleted);
를
recvArgs.Completed += OnRecvCompleted;
로 바꾸어도 아무런 차이점이 없는 것 맞을까요?
내부적으로 돌아가는게 다르다던가, 아니면 new를 써서 뭔가 메모리적으로나 컴파일러가 일 할때 달라진다거나.. 그런게 있을까요?
[최초 등록일: ]
[최종 수정일: 3/1/2023]