문제

여기에 내가 이해하지 못하는 비동기 소켓이있는 시나리오는 다음과 같습니다. 2 개의 TCP 소켓, 클라이언트 소켓 및 서버 소켓이 있습니다. 내 서버 소켓이 바인딩되고 포트에서 듣습니다.

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

내 출발을 위해 지정된 AsyncCallback이 호출되고 Iasyncresult가 완료되었다고 말하고 socket.endsend ()가 예외를 제기하지 않는다고 말합니다.

내가 얻지 못하거나 내 asynccallback이 시작되지 않아야 할 것이 있습니까? 시작 호출이 실제로 서버에 무언가를 보내는 경우에만 호출되지 않습니까 (예 : 서버가 모든 바이트를 수신 한 후 호출 된 콜백)? 서버에 수신이 완료되지 않은 경우, SendTimeout이 만료 된 후에 내 콜백을 호출해서는 안되며 Socket.endsend에 대한 내 호출은 예외를 제기 할 것입니까?

감사

도움이 되었습니까?

해결책

아니, TCP/IP 가이 모든 것을 처리합니다. 연결의 양쪽에 버퍼가 수신 될 때까지 데이터를 보유 할 수있는 버퍼가 있습니다. 버퍼링이 없으면 수다스러운 커뮤니케이션을 보낼 때 끔찍한 대기 시간이있을 것입니다.

편지를 우편으로 보내는 것처럼 생각하십시오. 메일 맨이 집어 올 때까지 사서함에 앉아 있습니다. 그런 일이 발생하면 전송되었습니다. 아직 접수되지 않았습니다. 운송 중일 수도 있고 사서함에서 읽을 때까지 기다릴 수 있습니다.

그래서 시작 후 콜백을받는 것은 전송된. 다른 쪽이 데이터를 수신하고 처리했는지 확인하는 유일한 방법은 인정 시간을 다시 요청하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top