TCP 클라이언트에 대한 코드를 상속 받았습니다. 메시지를 보낸 다음 완료되면 확인 메시지를 기다립니다. 현재는 메시지를 보내지 만 응답 메시지를 기다리면 수신하지 못합니다. SendMessage()
메서드는 외부 적으로 호출되는 메서드입니다.C# TCP 클라이언트가 메시지를 보내지 만 수신하지 않습니다.
나는 중단 점을 설정하고이 Receive()
방법 안타 볼 수 있지만 결코 ReceiveCallback()
어떤 도움이나 감사 올바른 방향으로 조금씩 이동.
public class SocketService
{
private ManualResetEvent connectDone = new ManualResetEvent(false);
private ManualResetEvent sendDone = new ManualResetEvent(false);
private ManualResetEvent receiveDone = new ManualResetEvent(false);
string ipAddress;
private int portNum;
string returnMessage;
// private string hostName = Dns.GetHostName();
public SocketService(string ipAddress, int portNum)
{
this.ipAddress = ipAddress;
this.portNum = portNum;
}
public event Logging OnLogging;
private void WriteLogMessage(string message)
{
if (this.OnLogging != null)
this.OnLogging(message);
}
//char endOfLineSeparator = (char) 0x1C;
//char cr = (char) 0x0D;
//char vt = (char) 0x0B;
public string SendMessage(string message)
{
IPAddress ip = IPAddress.Parse(this.ipAddress);
IPEndPoint remoteEP = new IPEndPoint(ip, portNum);
connectDone.Reset();
Socket client = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
client.BeginConnect(remoteEP,
new AsyncCallback(ConnectCallback),
client);
connectDone.WaitOne();
//sendDone.Reset();
WriteLogMessage("send message");
Send(client, message);
sendDone.WaitOne();
//receiveDone.Reset();
WriteLogMessage("receive message");
Receive(client);
receiveDone.WaitOne();
client.Shutdown(SocketShutdown.Both);
client.Close();
return this.returnMessage;
}
private void Send(Socket client, String data)
{
byte[] byteData = Encoding.ASCII.GetBytes(data);
client.BeginSend(byteData,
0,
byteData.Length,
0,
new AsyncCallback(SendCallback),
client);
}
private void SendCallback(IAsyncResult ar)
{
Socket client = (Socket)ar.AsyncState;
int bytesSent = client.EndSend(ar);
sendDone.Set();
}
private void ConnectCallback(IAsyncResult ar)
{
Socket client = (Socket)ar.AsyncState;
client.EndConnect(ar);
connectDone.Set();
}
private void Receive(Socket client)
{
StateObject state = new StateObject(client);
client.BeginReceive(state.Buffer,
0,
StateObject.BufferSize,
0,
new AsyncCallback(ReceiveCallback),
state);
}
private void ReceiveCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket client = state.WorkSocket;
int bytesRead = client.EndReceive(ar);
if (bytesRead > 0)
{
state.StoredContent.Append(Encoding.ASCII.GetString(state.Buffer, 0, bytesRead));
client.BeginReceive(state.Buffer,
0,
StateObject.BufferSize,
0,
new AsyncCallback(ReceiveCallback),
state);
WriteLogMessage(state.StoredContent.ToString());
}
else
{
this.returnMessage = state.StoredContent.ToString();
receiveDone.Set();
}
}
}
'ManualResetEvent'를 모두 주석 처리하고 다시 시도하십시오.'ReceiveCallback'이 호출됩니까? –
TCP 위에 구현하는 프로토콜에 따라 "메시지"의 정의는 무엇입니까? 상대방은 응답 할 수 있도록 전체 메시지를 받았음을 어떻게 알 수 있습니까? –
BTW : 콜백 동기화가 쉬운 작업이 아니므로 SendTaskAsync, ReceiveTaskAsync 등과 같은 * awaitable * async * 메소드를 사용하는 것이 좋습니다. –