C# - .NET Core 2.0 이하의 Unix Domain Socket 사용 시 System.IndexOutOfRangeException 오류
이전 글의 마지막에서,
C# - .NET Core Unix Domain Socket 사용 예제
; https://www.sysnet.pe.kr/2/0/11963
.NET Core 2.0 이하의 경우 다음에 공개된 UnixEndPoint 소스 코드를 사용하면 된다고 했는데요.
How to connect to a Unix Domain Socket in .NET Core in C#
; https://stackoverflow.com/questions/40195290/how-to-connect-to-a-unix-domain-socket-in-net-core-in-c-sharp
그 당시에는 사용할 일이 없다가 최근에 한 번 써봤는데 Accept 시에 ^^; 다음과 같은 예외가 발생합니다.
using (Socket clntSocket = _serverSocket.Accept())
/*
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at System.Net.Internals.SocketAddress.get_Item(Int32 offset)
at System.Net.Sockets.IPEndPointExtensions.GetNetSocketAddress(SocketAddress address)
at System.Net.Sockets.IPEndPointExtensions.Create(EndPoint thisObj, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Accept()
at ConsoleApp1.Program.serverSockFunc(Object obj) in c:\temp\ConsoleApp1\ConsoleApp1\Program.cs:line 72
*/
에러를 없애려면 해당 소스 코드에서 2군데를 수정해야 합니다.
public UnixEndPoint(string filename)
{
//if (filename == null)
// throw new ArgumentNullException("filename");
//if (filename == "")
// throw new ArgumentException("Cannot be empty.", "filename");
this.filename = filename;
}
public override SocketAddress Serialize()
{
byte[] bytes = Encoding.Default.GetBytes(filename);
SocketAddress sa = new SocketAddress(AddressFamily, 0x6c + 2);
// sa [0] -> family low byte, sa [1] -> family high byte
for (int i = 0; i < bytes.Length; i++)
sa[2 + i] = bytes[i];
//NULL suffix for non-abstract path
sa[2 + bytes.Length] = 0;
return sa;
}
이 중에서 0x6c가 나온 이유를 검색해 보니 다음과 같이 나오는군요. ^^
Why is the maximal path length allowed for unix-sockets on linux 108?
; https://stackoverflow.com/questions/34829600/why-is-the-maximal-path-length-allowed-for-unix-sockets-on-linux-108
수정한 전체 소스 코드는 다음의 github에 올려 두었습니다.
DotNetSamples/NetCore/UnixDomainSocketSample
; https://github.com/stjeong/DotNetSamples/tree/master/NetCore/UnixDomainSocketSample
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]