2012-09-12 7 views
0

TCP/IP를 클라이언트로 사용하여 외부 장치와 통신하는 응용 프로그램을 만들었습니다. 통신을 위해 Synapse 라이브러리 (v40)를 사용하고 있습니다. 때로는 통신이 멈추는 경우가 있습니다. 나는 JclDebug로 콜 스택 (callstack)을 얻을 수 있었는데, 정의 된 타임 아웃에도 불구하고 패킷을받는 것이 문제였다.시냅스 TBlockSocket 가끔 동결

델파이 2009가 사용되었습니다.

이 문제를 해결하기위한 방법이 있습니까? 시냅스 버그?

[77297094] KiFastSystemCallRet 
[006193FE] blcksock.TBlockSocket.InternalCanRead (Line 2741, "synapse\blcksock.pas") 
[0061945C] blcksock.TBlockSocket.CanRead (Line 2764, "synapse\blcksock.pas") 
[006185E5] blcksock.TBlockSocket.RecvPacket (Line 2324, "synapse\blcksock.pas") 
[0061888F] blcksock.TBlockSocket.RecvTerminated (Line 2410, "synapse\blcksock.pas")  
... my own code.. 

편집 : 블로킹 라인은 다음과 같습니다

x := synsock.Select(FSocket + 1, @FDSet, nil, nil, TimeVal); 

선택 α- 함수는 Winsock2를 API에서입니다.

Edit2가 :

var 
    TimeVal: PTimeVal; 
    TimeV: TTimeVal; 
.. 
    TimeV.tv_usec := (Timeout mod 1000) * 1000; 
    TimeV.tv_sec := Timeout div 1000; 
    TimeVal := @TimeV; 
    if Timeout = -1 then 
    TimeVal := nil; 

원본 소스 코드가 여기에 있습니다 : : http://synalist.svn.sourceforge.net/viewvc/synalist/trunk/blcksock.pas?revision=154&view=markup

사용 제한 시간이 1000

입니다 EDIT3 : 나는 두 가지를했습니다 timeval 형은 시냅스 코드에 의해 설정된다 두 개의 다른 호스트와 통신하기 위해 실행중인 클라이언트 스레드. 다른 사람이 교수형에 처하는 것처럼 보입니다. 신청서는 목요일부터 지금까지 운영 중입니다. Thread # 2는 5 시간 후에 중단되었지만 Thread # 1은 여전히 ​​실행 중입니다.

+0

'TimeVal'이 (가) 설정되는 것은 무엇입니까? –

+0

@RemyLebeau 질문에 대한 추가 정보를 추가했습니다. – Harriv

답변

1

동결 이유를 찾지 못해서 코드로 조금씩 바뀌었고 이제는 CRLF로 RecvTerminated를 '>'대신 terminater로 호출하여 끝내지 않고 작동하는 것 같습니다.