https://docs.microsoft.com/ko-kr/dotnet/api/system.net.sockets?view=net-5.0
System.Net.Sockets 네임스페이스
네트워크 액세스를 엄격하게 제어해야 하는 개발자를 위한 Winsock(Windows 소켓) 인터페이스에 대해 관리되는 구현을 제공합니다. Provides a managed implementation of the Windows Sockets (Winsock) interface for develo
docs.microsoft.com
마이크로 프로세스 소켓 API 를 사용할꺼임
방법: 소켓 만들기
원격 디바이스와 통신하도록 소켓을 초기화하는 방법을 알아봅니다. Socket 클래스를 사용하여 주소 패밀리, 소켓 형식, 프로토콜 유형을 지정합니다.
docs.microsoft.com
UNIX Network Programming Vol.1 (3판) 저자 W. Richard Stevens
UNIX Network Programming Vol.1 (3판)
유닉스 환경의 네트워크 프로그래밍을 다루는 책으로 알려진 원서의 번역서이다. 특히 IPC라고 불리는 Interprocess Communications 프로그래밍 개발 방법에 대해 중점적으로 다루고 있다. 프로세스들
www.aladin.co.kr
이 책 좋음 (원보이 좋음 )
3 way handshake 연결을 위한 3가지 단계
4 way handshake closing 을 위한 4가지 단계
https://hyoje420.tistory.com/4
[Network]3-Way Handshake
클라이언트와 서버가 TCP소켓으로 연결할때 서로의 연결상태를 3단계로 확인하는 것이 3-Way Handshake다. 이를 이해하려면 먼저 TCP소켓의 특징에 대하여 알아야할 필요가 있다. TCP는 연결 지향 소켓
hyoje420.tistory.com
위의 블로그는 4way hand shake 에 대해서도 설명하고 있다.
서버측 c# 예제 코드
using System;
using System.Net;
using System.Net.Sockets;
namespace NetSocket_20210817_001
{
class Program
{
static void Main(string[] args)
{
Socket aSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
IPEndPoint endpoint = new IPEndPoint(0, 5000); // 포트 번호랑 ip(0.0.0.0) 만듬
Console.WriteLine("아이피 번호 , 포트 번호 : " + endpoint);
aSocket.Bind(endpoint); // 소캣 바인딩
aSocket.Listen(5); // 리슨중 ...... -> 서버측 소캣으로 동작 리슨은 서버만 하니깐
Console.WriteLine("클라이언트 접속 대기중 .....");
Socket aClient = aSocket.Accept(); // 대기 상태의 클라이언트 소캣과 연결 , 즉 클라이언트가 올 때까지 대기(블록킹메소드)
//accept 시 server 측 소캣을 복사(accept 소캣)해서 클라이언트 소캣과 연결한다 즉 어셉트 할때마다 소캣을 새로만든다.
// 서버소캣(랑데뷰 소켓이라한다.)은 직접 연결하지 않는다.
// 통신 ............
Console.WriteLine("클라이언트 접속 대기중 .....");
aClient.Close(); // 클라이언트 소캣 종료
aSocket.Close(); // 서버 소캣 종료
}
}
}
위 코드를 2번 실행해 보면 2번째에서는 binding 에서 에러가 발생한다.
port 는 1 프로세스에만 존재하고 동일한 port 번호가 2개일 수 없기 때문에 위와 같은 에러가 발생한다.
console 을이용한 간단한 서버 클라이언트 코드
서버
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace NetSocket_20210817_001
{
class Program
{
static void Main(string[] args)
{
byte[] aData = new byte[256];
int byteCount; // 수신받은 데이터의 byte크기
string receivedString;
Socket aSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
aSocket.Bind(new IPEndPoint(0, 5000));
aSocket.Listen(5);
Console.WriteLine("클라이언트 올 때까지 대기중 .....");
Socket aClient = aSocket.Accept();
Console.WriteLine("클라이언트 접속완료");
// 통신 ............
while (true)
{
byteCount = aClient.Receive(aData, 0, aClient.Available, SocketFlags.None);
if (byteCount > 0)
{
receivedString = Encoding.UTF8.GetString(aData, 0, byteCount);
if (aData[0] == 'q')
{
break;
}
Console.WriteLine ( "수신 받은 byte size : " + byteCount + " 데이터 string " + receivedString);
}
}
Console.WriteLine("서버 종료");
aClient.Close();
aSocket.Close(); // 랑데뷰 소캣 종료
}
}
}
클라이언트
using System;
using System.Net.Sockets;
using System.Text;
namespace NetSocket_client_001
{
class Program
{
static void Main(string[] args)
{
byte[] aData = new byte[256];
string aString;
Socket aSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Console.WriteLine("서버 접속 시도중");
aSocket.Connect("127.0.0.1", 5000);
Console.WriteLine("서버 접속성공");
// 통신 ............
while (true)
{
Console.Write("입력 : ");
aString = Console.ReadLine();
aData = Encoding.UTF8.GetBytes(aString);
aSocket.Send(aData, aData.Length, SocketFlags.None);
if (aData[0] == 'q')
{
break;
}
}
Console.WriteLine("서버 종료");
aSocket.Close(); // 랑데뷰 소캣 종료
}
}
}
'공부,일 > C# 네트워크' 카테고리의 다른 글
packet 분석기 만들기 (3) (0) | 2021.09.15 |
---|---|
packet 분석기 만들기 (2) HexaViewer , NIC 선택 (0) | 2021.09.10 |
packet 분석기 만들기 (1) (0) | 2021.09.10 |
20210818 네트워크 프로그래밍 채팅 프로그램 만들기 (M:M) (1) | 2021.08.18 |
210817 쓰레드 (0) | 2021.08.17 |
댓글