2008-09-19 3 views
0

gsoap을 사용하여 C++에서 비누 서버를 만듭니다. 메시지는 Java로 작성된 버스를 통해 라우트됩니다. 서버와 버스 모두 멀티 스레드입니다. 모든 것이 시스템을 통해 한 번에 하나의 메시지를 보내는 것이 효과적입니다. 가능한 한 빨리 각 클라이언트가 3 개의 메시지를 보내는 경우 약 3500 개의 메시지가 정상적으로 처리됩니다. 그런 다음 주기적으로 "한 번에 하나의 소켓 연결 만 허용"을 받기 시작합니다. gsoap 코드의 오류. 일반적으로 약 4000 개의 메시지 중 약 3950 개가 OK입니다. 마지막 500 건의 전송에서 50 건의 오류가 발생했습니다.C++의 Gsoap 오류

  1. 왜 이러한 오류는 많은 송신 후에 발생하지만 송신의 시작 부분에서 발생하지 않습니까? 전송 속도는 증가하지 않습니다.

  2. 무슨 내용입니까? 오류에 대한 설명을 찾을 수 없으며 그 의미가 분명하지 않습니다.

  3. 누구나 성공적으로 gsoap 앱을 멀티 스레드 했습니까?

여기 내 서버 코드입니다.

long WINAPI threadGO(soap *x); 

int main(int argc, char* argv[]) 
{ 
HANDLE thread1; 
int m, s; /* master and slave sockets */ 
struct soap *soap = soap_new(); 
if (argc < 2) 
soap_serve(soap); /* serve as CGI application */ 
else 
{ 
    m = soap_bind(soap, NULL, atoi(argv[1]), 100); 
    if (m < 0) 
    { 
     soap_print_fault(soap, stderr); 
     exit(-1); 
    } 
    fprintf(stderr, "Socket connection successful: master socket = %d\n", m); 
    for (;;) 
    { 
    s = soap_accept(soap); 
    thread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threadGO,soap_copy(soap),0,NULL); 
    } 
} 
soap_done(soap); 
free(soap); 
return 0; 
} 

long WINAPI threadGO(soap *x) 
{ 
soap_serve(x); 
soap_end(x); 
return 0 

; 
} 

답변

1

나는 threadGO에서 리소스가 누출되었다고 생각합니다.

soap_destroy(x); 
soap_end(x); 
soap_free(x); 

특히, (soap_free()에서 호출) soap_done()에 누락 된 호출이 종료되는 soap_closesock()를 호출

soap_copy()과 비누 구조체를 복사 한 후, 나는 그것이 모두를 호출하여 해제 할 필요가 생각 소켓.