2010-03-18 4 views
3

다음은 비동기 소켓이있는 시나리오입니다. 2 개의 Tcp 소켓과 클라이언트 소켓 & 서버 소켓이 있습니다. 내 서버 소켓은 포트에서 수신 대기 &입니다.C# Socket.BeginSend AsyncCallback 비헤이비어 (시간 초과?)

내 클라이언트 소켓이 서버 소켓에 연결됩니다 (BeginConnect/EndConnect 사용). 그런 다음 BeginSend()를 사용하여 서버에 메시지를 보냅니다. 서버 측에서는 Receive() 또는 BeginReceive()를 수행하지 않습니다.

무슨 일 뭔가 ... 내 BeginSend 호출에 지정된 내 AsyncCallback은 IAsyncResult를가 어떤 예외를 발생시키지 않습니다 & Socket.EndSend()에 대한 호출을 완료되었음을 알려줍니다 &를 호출 가져옵니다이

가되어입니다 BeginSend 호출이 서버에 실제로 뭔가를 보냈을 때만 (즉, 서버가 모든 바이트를받은 후에 콜백 호출) AsyncCallback을 호출하지 않아도됩니다. 서버에서받은 수신이 없으면 sendtimeout이 만료되고 Socket.EndSend에 대한 호출이 예외를 발생시킨 후에 내 콜백을 호출하지 않아야합니까?

감사합니다.

답변

3

아니요, TCP/IP가이 모든 것을 처리합니다. 데이터를 수신 할 수있을 때까지 데이터를 보유 할 연결의 양쪽에 버퍼가 있습니다. 버퍼링이 없다면, 수다스러운 의사 소통을 보낼 때 아마도 끔찍한 대기 시간이 걸릴 것입니다.

편지를 보내는 것과 같습니다. 우편 배달부가 우편물을 집을 때까지 우편함에 앉아 있습니다. 일단 그런 일이 발생하면 보냈습니다. 그것은 아직받지 못했습니다. 그것은 운송 중일 수도 있고, 우편함에서 읽으려고 기다리는 중일 수도 있습니다.

BeginSend가 끝난 후 콜백을 받으면 으로 전송되었음을 알 수 있습니다. 상대방이 데이터를 수신하고 처리했음을 확실히 알 수있는 유일한 방법은 확인 응답을 다시 요청하는 것입니다.

+0

기다려주세요. 서버로부터 TCP ACK를 받기 전에 beginend 콜백이 호출됩니까? 나는 내가 이것을 좋아하는지 모른다. – Chris