System.Net.Sockets.Socket의 비동기 수신 메서드에 심각한 문제가 있습니다. 여기 C# : Socket.BeginReceive에서 AsyncCallback이 호출되지 않습니다.
내가 연결을 여는 데 사용하는 코드입니다 :_socket = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
_socket.Connect(endpoint);
byte[] buffer = new byte[1024];
_socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, buffer);
을 여기 콜백 방법 :
private void ReceiveCallback(IAsyncResult result)
{
byte[] buffer = (byte[])result.AsyncState;
int count = _socket.EndReceive(result);
if (count > 0)
{
// Do something
}
buffer = new byte[1024];
_socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, buffer);
}
문제는 소켓에도 불구하고, ReceiveCallback가 호출되고 있지 않습니다이다
연결됨.
누구든지 나를 도와 줄 수 있습니까?
소켓으로 데이터가 전송되고 있습니까? 콜백 메소드는 데이터를 수신 할 때까지 호출되지 않습니다. ('count'는 결코 '0'이 될 수 없습니다.) – dtb
데이터가 콜백되면, msdn 문서는 "EndReceive 메서드가 데이터를 사용할 수있을 때까지 차단됩니다"라고 오해하기 쉽습니다. 콜백이 호출되지 않으면 EndReceive는 다음 중 하나가 아닙니다. 그렇다면 어떻게 연결 중단을 감지 할 수 있습니까? – haze4real
데이터를 사용할 수 있기 전에 EndReceive를 호출하면 EndReceive가 데이터를 사용할 수있을 때까지 차단합니다. 그러나 콜백은 데이터를 사용할 수있을 때만 호출되기 때문에 데이터를 사용할 수 있기 전에는 EndReceive를 호출하지 않습니다. * 데이터 전송만으로 연결에 대한 중단을 감지 할 수 있습니다 (연결이 중단 된 경우 실패합니다). – dtb