작성
·
28
0
안녕하세요
Tap강의에서 6분 9초에 31번째 줄 내용이 궁금합니다.
저는 ReceiveAsync메서드에는 2개 인수를 쓰는 오버로드가 없다고 떠서,
어떻게 수정하면되는지 궁금합니다.
-에러나는 내용
ReceiveAsync메서드에는 2개 인수를 쓰는 오버로드가 없다
-제가 적은 코드
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 인턴입니다. 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
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.