2016-12-19 4 views
2

.NET Framework 4.6.2 및 C#을 사용하여 소켓 서버 및 클라이언트를 개발하고 있습니다.소켓 시간 초과 후 보류중인 모든 데이터를 제거하십시오.

클라이언트는 SynchronousSocketClient입니다.

서버 클래스는 다소 비슷합니다. one.

클라이언트에서 데이터베이스를 업데이트하기 위해 데이터를 보냅니다.

서버에서 나는 저장 프로 시저를 사용하여 테이블을 업데이트하는 데이터베이스에서 작업을 수행합니다.

프로세스는 클라이언트가 데이터를 서버로 보내고 서버가 처리하고 그 결과와 함께 메시지를 다시 보냅니다.

때로는 데이터베이스 작업이 더 많은 시간을 할 때가 있습니다. 이 시간이 Socket.ReceiveTimeout보다 큰 경우 TimeOut으로 인해 SocketException이 표시되고 서버에서 오는 데이터를 처리하지 않습니다.

서버에서 보낸이 데이터를 처리 할 수있는 방법이 있습니까?

TimeOut 이후 서버에서 보낸 데이터에 대해 더 이상 기다리지 않고 새 데이터를 서버로 보내는 과정을 다시 시작하지만이 새로운 데이터에서 서버 결과를 읽으려고하면 이전 서버 응답을 읽으십시오.

클라이언트의 프로세스가 매우 중요하므로 서버에서 응답을 얻으려고 기다릴 수 없습니다. 데이터 처리를 계속해야합니다.

답변

0

그러나이 새 데이터에서 서버 결과를 읽으려고하면 이전 응답에 대한 서버 응답을 읽습니다.

서버에 메시지를 보낼 때 ID를 사용하는 것이 좋습니다. (송신 버퍼의 처음 2 바이트를 사용할 수 있습니다.) 서버는 응답을 보낼 때이 ID를 사용합니다. 이제 클라이언트 측에서 응답에 동일한 ID가 있는지 확인할 수 있습니다. 데이터가 있으면 데이터를 사용할 수 있습니다. 그렇지 않으면 폐기하고 다음 들어오는 응답을 읽으려고합니다. 도식적으로

그 결과는 다음과 같습니다

  ID = 1 
Client ------------> Server 

      ID = 1 
Client <------------ Server 

      ID = 2 
Client ------------> Server 

X----ERROR----TimeOut 
      ID = 3 

Client ------------> Server 

      ID = 2 
Client <------------ Server 

Client 3!=2 --> do not process, read again 

      ID = 3 
Client <------------ Server