C#

[C#] ASP.NET์˜ TCP ์—ฐ๊ฒฐ ์„ค์ •

hyonie 2025. 2. 17. 00:45

ASP.NET์—์„œ TCP ์—ฐ๊ฒฐ์€ ์ฃผ๋กœ TcpClient ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“‚ ๋ชฉ์ฐจ

 

 


TCP ์—ฐ๊ฒฐ ์„ค์ • ๊ณผ์ •

TCP ์—ฐ๊ฒฐ ์„ค์ •์€ 3-way handshake๋กœ ์•Œ๋ ค์ง„ ๊ณผ์ •์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ๋…ผ๋ฆฌ์ ์ธ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์„ ์‹œ์ž‘ํ•˜๋Š” ์ค€๋น„ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

 

TCP ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋ณธ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

 

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ ์š”์ฒญ(SYN)
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— TCP ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    • ์ด ๋ฉ”์‹œ์ง€๋Š” SYN ํ”Œ๋ž˜๊ทธ๊ฐ€ ํฌํ•จ๋œ ํŒจํ‚ท์ž…๋‹ˆ๋‹ค.
  2. ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ ์Šน์ธ(SYN-ACK)
    • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋ฉฐ SYN-ACK ํŒจํ‚ท์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Š” ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๊ฒฐํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‘๋‹ต(ACK)
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์˜ SYN-ACK์— ๋Œ€ํ•ด ํ™•์ธ ์‘๋‹ต(ACK)์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    • ์ด๋กœ์จ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ TCP ์—ฐ๊ฒฐ์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

 

TCP ์—ฐ๊ฒฐ ์„ค์ • ๊ธฐ๋ณธ ์ฝ”๋“œ

TcpClient client = new TcpClient(serverip, port)

 

1. TcpClient ์ƒ์„ฑ์ž:

  • IP ์ฃผ์†Œ(serverip)์™€ ํฌํŠธ(port)๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ TCP์˜ 3-way handshake๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

2. ๋„คํŠธ์›Œํฌ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ:

  • ์—ฐ๊ฒฐ์ด ์„ฑ๊ณตํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด ๋„คํŠธ์›Œํฌ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
NetworkStream stream = client.GetStream();

 

3. ๋ฐ์ดํ„ฐ ์†ก์‹ :

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด ์„œ๋ฒ„๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
byte[] data = Encoding.UTF8.GetBytes("Hello Server");
stream.Wtire(data, 0, data.Length);

 

4. ๋ฐ์ดํ„ฐ ์ˆ˜์‹ :

  • ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.
byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);

 

TCP ์—ฐ๊ฒฐ ์„ค์ •ํ•  ๋•Œ์˜ ์ฃผ์š” ๊ฐœ๋…

1. IP ์ฃผ์†Œ์™€ ํฌํŠธ

2. ReceiveTimeout(์ˆ˜์‹  ํƒ€์ž„์•„์›ƒ)

client.ReceiveTimeout = 10 * 1000;
  • ์„œ๋ฒ„ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(๋‹จ์œ„: ๋ฐ€๋ฆฌ์ดˆ)
  • ์„ค์ •ํ•œ ์‹œ๊ฐ„ ๋‚ด์— ์‘๋‹ต์ด ์—†์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(IOException)

3. NetworkStream

  • TCP ์—ฐ๊ฒฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์ž…๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•  ๊ฒฝ์šฐ ์ธ์ฝ”๋”ฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

TCP ์—ฐ๊ฒฐ ์„ค์ • ์‹œ ์ฃผ์˜์‚ฌํ•ญ

1. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

  • ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์‹คํŒจ, ํƒ€์ž„์•„์›ƒ, ์„œ๋ฒ„ ์˜ค๋ฅ˜ ๋“ฑ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ ์ ˆํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
try
{
  TcpClient client = new TcpClient(serverip, port);
  NetWorkStream stream = client.GetStream();
  // ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹  ๋กœ์ง
}
catch(SocketException ex)
{
  Console.WriteLine("์„œ๋ฒ„ ์—ฐ๊ฒฐ ์‹คํŒจ:" + ex.Message);
}
catch(IOException ex)
{
  Console.WriteLine("๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹  ์‹คํŒจ:" + ex.Message);
}

 

2. ๋ฆฌ์Šค์†Œ ๊ด€๋ฆฌ

  • TCP ์—ฐ๊ฒฐ์€ ๋„คํŠธ์›Œํฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์‚ฌ์šฉ์ด ๋๋‚œ ๋’ค ๋ฐ˜๋“œ์‹œ ์ŠคํŠธ๋ฆผ๊ณผ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋‹ซ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ์†Œ์Šค ๋ˆ„์ˆ˜ ๋ฐฉ์ง€ ์ฝ”๋“œ:
TcpClient client = null;
NetworkStram stream = null;

try
{
  client = new TcpClient(serverip, port);
  stream = client.GetStream();
  // ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹  ๋กœ์ง
}
finally
{
  stream?.Close();
  client?.Close();
}

 

3. ๋น„๋™๊ธฐ ๋ฐฉ์‹ ์‚ฌ์šฉ

  • ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ๋Œ€๊ธฐ๋กœ ์ธํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ๊ณ„์† ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ: ๋น„๋™๊ธฐ ์—ฐ๊ฒฐ ์„ค์ •
TcpClient client = new TcpClient();
await client.ConnectAsync(serverip, port);
NetworkStream stream = client.GetStream();