Socket.EndReceiveFrom 메서드
특정 끝점에서 보류 중인 비동기 읽기를 끝냅니다.
네임스페이스: System.Net.Sockets
어셈블리: System(system.dll)
구문
‘선언
Public Function EndReceiveFrom ( _
asyncResult As IAsyncResult, _
ByRef endPoint As EndPoint _
) As Integer
‘사용 방법
Dim instance As Socket
Dim asyncResult As IAsyncResult
Dim endPoint As EndPoint
Dim returnValue As Integer
returnValue = instance.EndReceiveFrom(asyncResult, endPoint)
public int EndReceiveFrom (
IAsyncResult asyncResult,
ref EndPoint endPoint
)
public:
int EndReceiveFrom (
IAsyncResult^ asyncResult,
EndPoint^% endPoint
)
public int EndReceiveFrom (
IAsyncResult asyncResult,
/** @ref */ EndPoint endPoint
)
JScript에서는 값 형식 인수를 참조로 전달할 수 없습니다.
매개 변수
- asyncResult
이 비동기 작업에 대한 상태 정보 및 사용자 정의 데이터를 저장하는 IAsyncResult입니다.
- endPoint
소스 EndPoint입니다.
반환 값
성공적이면 받은 바이트 수입니다. 실패하면 0을 반환합니다.
예외
예외 형식 | 조건 |
---|---|
asyncResult가 Null 참조(Visual Basic의 경우 Nothing)인 경우 |
|
BeginReceiveFrom 메서드를 호출했지만 asyncResult가 반환되지 않은 경우 |
|
EndReceiveFrom가 비동기 읽기를 위해 이미 호출된 경우 |
|
소켓에 액세스하려고 시도하는 동안 오류가 발생한 경우. 자세한 내용은 설명 부분을 참조하십시오. |
|
Socket이 닫힌 경우 |
설명
EndReceiveFrom 메서드는 BeginReceiveFrom 메서드에서 시작된 비동기 읽기 작업을 완료합니다.
BeginReceiveFrom를 호출하기 전에 AsyncCallback 대리자를 구현하는 콜백 메서드를 만들어야 합니다. 이 콜백 메서드는 별도의 스레드에서 실행되며 BeginReceiveFrom가 반환된 후 시스템에 의해 호출됩니다. 콜백 메서드의 경우 BeginReceiveFrom 메서드에 의해 매개 변수로 반환된 IAsyncResult를 사용해야 합니다.
콜백 메서드 내에서 IAsyncResult의 AsyncState 메서드를 호출하여 BeginReceiveFrom 메서드에 전달된 상태 개체를 가져옵니다. 이 상태 개체에서 받는 Socket을 추출합니다. Socket을 가져온 다음 EndReceiveFrom 메서드를 호출하여 성공적으로 읽기 작업을 마친 후 읽은 바이트 수를 반환할 수 있습니다.
EndReceiveFrom 메서드는 데이터를 사용할 수 있을 때까지 차단됩니다. 연결 없는 프로토콜을 사용하는 경우 EndReceiveFrom는 들어오는 네트워크 버퍼에서 첫 번째로 큐에 추가된 데이터그램을 읽습니다. 연결 지향 프로토콜을 사용하는 경우 EndReceiveFrom 메서드는 BeginReceiveFrom 메서드의 size 매개 변수에 지정한 바이트 수 한도까지 사용할 수 있는 데이터를 모두 읽습니다. 원격 호스트에서 Shutdown 메서드를 사용하여 Socket 연결을 끊고 사용할 수 있는 데이터를 모두 수신한 경우, EndReceiveFrom 메서드가 즉시 완료되고 0바이트를 반환합니다. 받은 데이터를 가져오려면 IAsyncResult 개체의 AsyncState 메서드를 호출하고 결과로 생성된 상태 개체에 포함된 버퍼를 추출합니다. 원래 호스트를 식별하려면 EndPoint를 추출하여 IPEndPoint로 캐스팅합니다. IPEndPoint.Address 메서드를 사용하여 IP 주소를 얻고 IPEndPoint.Port 메서드를 사용하여 포트 번호를 얻습니다.
참고
SocketException이 발생하면 SocketException.ErrorCode 속성을 사용하여 특정 오류 코드를 가져옵니다. 이 코드를 가져온 다음 MSDN Library의 Windows 소켓 버전 2 API 오류 코드 설명서에서 오류에 대한 자세한 설명을 참조하십시오.
참고
응용 프로그램에 네트워크 추적을 사용하도록 설정하면 이 멤버에서 추적 정보를 출력합니다. 자세한 내용은 네트워크 추적을 참조하십시오.
예제
다음 코드 예제에서는 특정 EndPoint에서 보류 중인 비동기 읽기를 끝냅니다.
Dim so As StateObject = CType(ar.AsyncState, StateObject)
Dim s As Socket = so.workSocket
' Creates a temporary EndPoint to pass to EndReceiveFrom.
Dim sender As New IPEndPoint(IPAddress.Any, 0)
Dim tempRemoteEP As EndPoint = CType(sender, EndPoint)
Dim read As Integer = s.EndReceiveFrom(ar, tempRemoteEP)
If read > 0 Then
so.sb.Append(Encoding.ASCII.GetString(so.buffer, 0, read))
s.BeginReceiveFrom(so.buffer, 0, StateObject.BUFFER_SIZE, 0, tempRemoteEP, New AsyncCallback(AddressOf Async_Send_Receive.ReceiveFrom_Callback), so)
Else
If so.sb.Length > 1 Then
'All the data has been read, so displays it to the console.
Dim strContent As String
strContent = so.sb.ToString()
Console.WriteLine([String].Format("Read {0} byte from socket" + "data = {1} ", strContent.Length, strContent))
End If
s.Close()
End If
End Sub 'ReceiveFrom_Callback
StateObject so = (StateObject) ar.AsyncState;
Socket s = so.workSocket;
// Creates a temporary EndPoint to pass to EndReceiveFrom.
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tempRemoteEP = (EndPoint)sender;
int read = s.EndReceiveFrom(ar, ref tempRemoteEP);
if (read > 0) {
so.sb.Append(Encoding.ASCII.GetString(so.buffer, 0, read));
s.BeginReceiveFrom(so.buffer, 0, StateObject.BUFFER_SIZE, 0, ref tempRemoteEP,
new AsyncCallback(Async_Send_Receive.ReceiveFrom_Callback), so);
}
else{
if (so.sb.Length > 1) {
//All the data has been read, so displays it to the console.
string strContent;
strContent = so.sb.ToString();
Console.WriteLine(String.Format("Read {0} byte from socket" +
"data = {1} ", strContent.Length, strContent));
}
s.Close();
}
StateObject^ so = safe_cast<StateObject^>(ar->AsyncState);
Socket^ s = so->workSocket;
// Creates a temporary EndPoint to pass to EndReceiveFrom.
IPEndPoint^ sender = gcnew IPEndPoint( IPAddress::Any,0 );
EndPoint^ tempRemoteEP = safe_cast<EndPoint^>(sender);
int read = s->EndReceiveFrom( ar, tempRemoteEP );
if ( read > 0 )
{
so->sb->Append( Encoding::ASCII->GetString( so->buffer, 0, read ) );
s->BeginReceiveFrom( so->buffer, 0, StateObject::BUFFER_SIZE, SocketFlags::None,
tempRemoteEP, gcnew AsyncCallback( &Async_Send_Receive::ReceiveFrom_Callback ), so );
}
else
{
if ( so->sb->Length > 1 )
{
//All the data has been read, so displays it to the console.
String^ strContent = so->sb->ToString();
Console::WriteLine( "Read {0} byte from socket" +
" data = {1}", strContent->Length, strContent );
}
s->Close();
}
StateObject so = (StateObject)ar.get_AsyncState();
Socket s = so.workSocket;
// Creates a temporary EndPoint to pass to EndReceiveFrom.
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tempRemoteEP = (EndPoint)sender;
int read = s.EndReceiveFrom(ar, tempRemoteEP);
if (read > 0) {
so.sb.Append(Encoding.get_ASCII().GetString(so.buffer, 0, read));
s.BeginReceiveFrom(so.buffer, 0, StateObject.BUFFER_SIZE,
(SocketFlags)0, tempRemoteEP,
new AsyncCallback(Async_Send_Receive.ReceiveFrom_Callback), so);
}
else {
if (so.sb.get_Length() > 1) {
//All the data has been read, so displays it to the console.
String strContent;
strContent = so.sb.ToString();
Console.WriteLine(String.Format("Read {0} byte from socket"
+ "data = {1} ", (Int32)(strContent.get_Length()),
strContent));
}
s.Close();
}
플랫폼
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.
버전 정보
.NET Framework
2.0, 1.1, 1.0에서 지원
.NET Compact Framework
2.0, 1.0에서 지원