Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

jacking75/edu_CSharpNetworkProgramming

Repository files navigation

C# 네트워크 프로그래밍 학습 저장소

학습

고성능 네트워크 관련 글

.NET Framework의 비동기 네트워크 라이브러리 성능 개선

  • 닷넷은 현재 버전 4.5가 나왔다.(2013年04月05日)
    • 성장한 만큼 많은 개선과 기능 추가가 있었다. 그러나 프로그래머들이 닷넷의 성장을 따라가지 못하는 경우가 많다.
    • 닷넷을 메인으로 사용하지 않는 경우는 당연하고, 주위의 닷넷 프로그래머들의 이야기를 들어보면 닷넷 프로그래머들도 최신 기술을 모르던가 사용하지 않는 경우가 많다고한다.
    • 대부분 2.0 대의 기술을 자주 사용한다고 한다.
  • 닷넷으로 고성능 네트웍 프로그래밍을 하기 위해 자료를 찾아보면 이전 방식을 사용한 경우가 많다.
    • 혹시 아래 소개한 것을 본적이 없다면 꼭 이것을 보고 닷넷으로 서버 프로그램을 개발하기 바란다(물론 궂이 고성능을 필요로 하지 않으면 기존 방식대로 해도 좋다)

SocketAsyncEventArgs

High performance asynchronous awaiting sockets

Tips

소켓 타임 아웃 설정

// 접속 대기
Socket client = tcplistener.AcceptSocket();
// 2초 동안 수신하지 못하면 타임아웃으로 설정
client.SetSocketOption( SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 2000 );
TcpClient client = new TcpClient("127.0.0.1", 12345);
client.ReceiveTimeout = 2000;
client.SendTimeout = 2000;

자신의 IP 얻기

IPAddress[] address = Dns.GetHostAddresses(Dns.GetHostName());

IP, 맥어드레스 얻기 - NetworkInformation 방식

var adapters = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
 
foreach (var adapter in adapters)
{
	if (adapter.OperationalStatus.Equals(System.Net.NetworkInformation.OperationalStatus.Up))
	{
		var properties = adapter.GetIPProperties();
		foreach (var ipInfo in properties.UnicastAddresses)
		{
			var ip = ipInfo.Address;
			if (!System.Net.IPAddress.IsLoopback(ip))
			{
				Console.WriteLine("IP = " + ip);
				Console.WriteLine("MAC = " + adapter.GetPhysicalAddress());
			}
		 }
	 }
}

맥어드레스 얻기 - SendARP 방식

using System;
using System.Net;
using System.Runtime.InteropServices;
[DllImport("iphlpapi.dll", ExactSpelling=true)]
private static extern int SendARP( int DestIP, int SrcIP, byte[] pMacAddr, ref int PhyAddrLen );
private byte[] getMacAddress(string val)
{
 return getMacAddress(IPAddress.Parse(val));
}
private byte[] getMacAddress(IPAddress addr)
{
 byte[] mac = new byte[6];
 int len = mac.Length;
 int r = SendARP( BitConverter.ToInt32(addr.GetAddressBytes(), 0), 0, mac, ref len );
 return mac;
}

UDP 브로드캐스트

IPEndPoint remoteIP = new IPEndPoint(IPAddress.Broadcast, 10002);
byte[] data = new byte[16];
Socket s = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, 
 ProtocolType.Udp );
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, 16);
// 브로드캐스트는 옵션으로 사용 가능하도록 한다 
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
s.SendTo(data, data.Length, SocketFlags.None, remoteIP);

UDP TTL 지정

// 보낼 곳
IPEndPoint remoteIP = new IPEndPoint(IPAddress.Parse("192.168.11.2"), 80);
// 보낼 데이터
byte[] data = new byte[16];
// UDP 소켓 만들기
Socket s = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.U에 );
// TTL를 설정
// TTL라는 것은...→ http://e-words.jp/w/TTL-2.html
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, 255);
// 데이터를 보낸다
s.SendTo(data, 0, data.Length, SocketFlags.None, remoteIP);

컴퓨터의 네트워크 카드 리스트

using System.Management; // 참조 설정에 System.Management 를 추가
ManagementClass mc = new ManagementClass("Win32_PerfRawData_Tcpip_NetworkInterface");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
 // 정보를 표시
 Console.WriteLine("이름 = {0}", mo["Name"]);
 Console.WriteLine("접속 속도 = {0} Mbps", 
 Convert.ToInt32(mo["CurrentBandwidth"]) / 1000 / 1000);
 Console.WriteLine("------");
}

About

컴투스 C# 네트워크 프로그래밍 학습

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /