인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

skagns601님의 프로필 이미지

작성한 질문수

C# TCP/IP 소켓 프로그래밍

TAP

Tap강의에서 6분9초에 ReceiveAsync에 매개변수 e가 필요하다는 에러

작성

·

28

0

안녕하세요

Tap강의에서 6분 9초에 31번째 줄 내용이 궁금합니다.

 

저는 ReceiveAsync메서드에는 2개 인수를 쓰는 오버로드가 없다고 떠서,

어떻게 수정하면되는지 궁금합니다.

 

-에러나는 내용

ReceiveAsync메서드에는 2개 인수를 쓰는 오버로드가 없다

image.pngimage.png

 

-제가 적은 코드

int n1 = await clientSocket.ReceiveAsync(buffer,SocketFlags.None);

 

 

--전체 코드

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Net;

using System.Net.Sockets;

using System.Threading;

namespace Server

{

class Program

{

static async Task Main(string[] args)

{

Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.20.97"), 20000);

serverSocket.Bind(endPoint);

serverSocket.Listen(1000);

//Tap( 작업기반 비동기 패턴) 작업짜기

while(true)

{

//서버 소켓에 어웨이트 소켓을 써라, 이 함수는 반환값이 <task>socket임

Socket clientSocket = await serverSocket.AcceptAsync();

// 제네릭한 값을 갖는 Task를 await하게하면 제네릭을 반환값으로 가질 수 있음

//스레드 풀에 일감을 던짐 , 즉 Readasync하라는거임

ThreadPool.QueueUserWorkItem(ReadAsync, clientSocket);

}

}

/// <summary>

/// 스레드풀에 들어갈 함수 , 클라이언트 소켓이 센더로 들어감

/// </summary>

/// <param name="sender"></param>

private static async void ReadAsync(object sender)

{

//클라이언트 소켓이 센더로 들어감

Socket clientSocket = (Socket)sender;

//리시브 함수 루프 돌리기

while(true)

{

byte[] buffer = new byte[256];

int n1 = await clientSocket.ReceiveAsync(buffer,SocketFlags.None);

//만약 0바이트면 종료된거니까 자원 해제하고 return으로 함수 종료

if (n1<1)

{

Console.WriteLine("Client disconnect");

clientSocket.Dispose();

return;

}

Console.WriteLine(Encoding.UTF8.GetString(buffer));

}

}

}

}

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. skagns601님.

소켓 프로그래밍에서 ReceiveAsync 메서드는 데이터 수신을 비동기적으로 처리하는데 사용되며, 이 메서드는 보통 SocketAsyncEventArgs 객체를 매개변수로 사용하는 오버로드만 제공됩니다. 따라서 현재 겪고 있는 문제는 올바르지 않은 메서드 오버로드를 사용하고 있기 때문입니다.

ReceiveAsync 메서드를 사용하려면, 다음과 같이 SocketAsyncEventArgs 객체를 생성하여 사용해야 합니다:

SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.SetBuffer(buffer, 0, buffer.Length);
args.Completed += (s, e) => {
    // 데이터를 수신하고 난 후 완료 이벤트 핸들러
    if (e.BytesTransferred > 0)
    {
        Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, e.BytesTransferred));
    }
    else
    {
        Console.WriteLine("Client disconnect");
        clientSocket.Dispose();
    }
};
await clientSocket.ReceiveAsync(args);

위의 예시처럼 SocketAsyncEventArgs를 통해 버퍼 설정과 완료 핸들러를 등록하세요. 추가적으로, 완전한 비동기 프로그래밍을 구현하려면 Completed 이벤트 핸들러를 통해 수신 작업 이후에 필요한 처리 로직을 작성하는 것이 일반적입니다.

이와 관련된 Stack Overflow 토론도 참고하시기 바랍니다: Why is cross-thread operation exception not thrown while running exe in bin\Debug - Stack Overflow

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.