Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 완전탐색
- Server
- 코딩테스트
- c#
- React
- 백트래킹
- JavaScript
- 제로베이스 프론트엔드 스쿨
- 코딩테스트 스터디
- 서버
- leetcode
- 알고리즘
- 백준
- Algorithm
- map
- 자바스크립트
- 메모리 배리어
- 멀티스레드
- N과 M(2)
- socket
- C++
- MemoryBarrier
- 문자열&연산자
- BFS
- 제로베이스
- dfs
- 구조체
- 프로그래머스
- 프론트엔드 스쿨
- 구현
Archives
- Today
- Total
Written
소켓 프로그래밍 #1 본문

코드의 흐름
아래 코드들을 실행하면서 코드의 흐름에 대해서 궁금한 점이 생김.
=> 클라이언트의 Connceting을 실행하는 코드와, 서버의 Accept를 실행하는 코드는 서로 연관성이 없어보이고 따로 서로를 호출하는 코드도 존재하지 않는데 위에 보이는 이미지의 순서로 정말 알아서 동작하고 있는걸까 ?
=> 콘솔 출력을 통해서 확인해보니 Connect 함수를 실행하기 직전에 이미 서버 콘솔창에는 Listening이 출력되고 있었다. Connect 함수를 실행하고 난뒤 서버 콘솔창을 보니 Accept 함수 다음으로 바로 아래에 추가로 만들어둔 콘솔 출력이 출력되고 있었음. 즉 코드간에 직접적인 연관이 없어 보였지만, 위 이미지의 순서처럼 connect -> accept 순서로 잘 동작하고 있음을 확인함 ! ( 콘솔 출력 코드는 이미 글을 올리고 난 뒤 궁금하여 추가해서 실험해본 것이라 아래 이미지에는 존재X)
=> 코드 흐름의 궁금증 해결 완료.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
static void Main(string[] args)
{
//Socket은 인자를 넘겨줘야함. IP주소 , TCP인지UDP인지 정해줘야함
//Dns사용
string host = Dns.GetHostName(); //내 IP 추출
IPHostEntry ipHost = Dns.GetHostEntry(host);
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777);
Socket listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
//소켓을 생성했으니 IP주소와 연결(Bind) + 대기(Listen)진행
listenSocket.Bind(endPoint);
listenSocket.Listen(10);
try
{
//이제 대기중인 상태에서, 클라에서 Connection이 오면 Accept 해준다.
while (true)
{
Console.WriteLine("Listening.....");
//Accept하면 통신을 위한 소켓 하나를 반환해줌.
Socket clientSocket = listenSocket.Accept();
//받기와 보내기 Recv와 Send
//받으려면 받아낼 바구니가 필요함. 그 바구니가 RecvBuff다!
byte[] recvBuff = new byte[1024];
//Receive함수가 int를 반환한다 -> 몇 바이트를 받았는지 리턴해줌.
int recvBytes = clientSocket.Receive(recvBuff);
//클라에서 보낸 문자열 데이터가 recvBuff에 들어갈때 byte 배열로 들어갔는데, 그걸 다시 문자열로 복원해주는 함수
string recvData = Encoding.UTF8.GetString(recvBuff, 0, recvBytes);
Console.WriteLine($"[From Client : {recvData}");
//보낸다 -> 문자열을 Bytes로 변환해주는 함수를 통해 sendBuff에 저장함
byte[] sendBuff = Encoding.UTF8.GetBytes("Welcome MMO SERVER");
clientSocket.Send(sendBuff);
//연결 종료.
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
static void Main(string[] args)
{
string host = Dns.GetHostName();
IPHostEntry ipHost = Dns.GetHostEntry(host);
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777);
// 통신을 위한 소켓 생성
Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
//연결 시도 Connection
socket.Connect(endPoint);
Console.WriteLine($"서버와 연결 성공 : {socket.RemoteEndPoint.ToString()}");
//보내기
byte[] sendBuff = Encoding.UTF8.GetBytes("Hello Server!");
int sendBytes = socket.Send(sendBuff);
//받기
byte[] recvBuff = new byte[1024];
int recvBytes = socket.Receive(recvBuff);
string recvString = Encoding.UTF8.GetString(recvBuff, 0, recvBytes);
Console.WriteLine($"[From serve] : {recvString}");
//연결 끊기
socket.Close();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
|
cs |

'Server > 소켓' 카테고리의 다른 글
소켓 프로그래밍 #2 (0) | 2023.07.13 |
---|