sem_t신호량으로 인해 두 개의 Doubango 응용 프로그램(idoubs)이 등록 메시지를 수신하는 것이 정상적이지 않습니다.
만약 내가 먼저 idoubs1을 실행하고 정상적으로 연결한 후에 idoubs2를 열면 idoubs2는 서버에 연결되지 않습니다.실제로 idoubs2에서 서버에 등록 메시지를 보냈습니다.서버도idoubs2에 메시지를 반환했습니다.그러나sip층에서sip 메시지를 수신하는 함수
static int tsip_transport_layer_stream_cb(const tnet_transport_event_t*e)가 응답하지 않았습니다. 이어서 중단점을udp층의 recvfrom () 함수에 설정할 수 밖에 없습니다. 여러 번 디버깅을 했는데 recvfrom () 함수 앞에 설정된 중단점이 멈추지 않았습니다. 오랫동안 이유를 몰라서 recvfrom () 으로udp 메시지를 받지 않는 줄 알았지만 그럴 리가 없습니다.나중에 공사cleanup를 한 번 하자,recvfrom () 전의 단점이 마침내 멈추었고, 받은 소식을 인쇄해 보니, 프로그램이 메시지를 받은 것을 발견하였다.관건은 소식을 sip층에 전달할 때 문제가 생겼다는 것이다.
이어서 static int tsip_을 보냈습니다.transport_layer_stream_cb(const tnet_transport_event_t*e) 이 함수가 리셋된 곳에 매크로가 정의한 신호량이 있습니다. 이 매크로 정의는 좀 이상합니다.
#define TSK_RUNNABLE_RUN_BEGIN(self) \
TSK_RUNNABLE(self)->running = tsk_true; \
for(;;) { \
tsk_semaphore_decrement(TSK_RUNNABLE(self)->semaphore); \
if(!TSK_RUNNABLE(self)->running && \
(!TSK_RUNNABLE(self)->important || (TSK_RUNNABLE(self)->important && TSK_LIST_IS_EMPTY(TSK_RUNNABLE(self)->objects)))) \
break;
#define TSK_RUNNABLE_RUN_END(self) \
} \
TSK_RUNNABLE(self)->running = tsk_false;
두 개의 매크로, 사실은 한 단락의 코드를 두 개의 매크로 정의에 분리한 다음에 리셋 함수는 두 개의 매크로 사이이다.TSK_RUNNABLE_RUN_BEGIN(transport);
if((curr = TSK_RUNNABLE_POP_FIRST_SAFE(TSK_RUNNABLE(transport)))){
const tnet_transport_event_t *e = (const tnet_transport_event_t*)curr->data;
if(transport->callback){
transport->callback(e);
}
tsk_object_unref(curr);
}
TSK_RUNNABLE_RUN_END(transport);
첫 번째 매크로 안의tsk_semaphore_decrement()
원래 Doubango 안에 udp층과sip층 사이는sem_t신호량으로 통신했습니다.신호량은 프로세스 간 통신을 실현할 수 있기 때문에 왜 idoubs2가sip메시지를 받지 못하는지 갑자기 알 수 있습니다. 만약 신호량의 표지부호가 같다면 idoubs2의 메시지는idoubs1에게 보낼 수 있습니다.이어서 신호량의 초기화를 찾아볼게요.
이 함수를 찾았습니다.
tsk_semaphore_handle_t* tsk_semaphore_create_2(int initial_val)
tsk_semaphore_handle_t* tsk_semaphore_create_2(int initial_val)
{
SEMAPHORE_T handle = tsk_null;
#if TSK_UNDER_WINDOWS
handle = CreateSemaphore(NULL, initial_val, 0x7FFFFFFF, NULL);
#else
handle = tsk_calloc(1, sizeof(SEMAPHORE_S));
#if TSK_USE_NAMED_SEM
named_sem_t * nsem = (named_sem_t*)handle;
tsk_sprintf(&(nsem->name), "/sem-%d", sem_count++);
if((nsem->sem = sem_open(nsem->name, O_CREAT /*| O_EXCL*/, S_IRUSR | S_IWUSR, initial_val)) == SEM_FAILED)
{
TSK_FREE(nsem->name);
#else
if(sem_init((SEMAPHORE_T)handle, 0, initial_val))
{
#endif
TSK_FREE(handle);
TSK_DEBUG_ERROR("Failed to initialize the new semaphore (errno=%d).", errno);
}
#endif
if(!handle){
TSK_DEBUG_ERROR("Failed to create new semaphore");
}
return handle;
}
자료를 찾아봤더니tsk_sprintf(&(nsem->name), "/sem-%d", sem_count++);
"/sem-%d"만 다르게 바꾸면 되는데..."/1sem-%d".. 드디어 문제가 해결되었군..
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
sem_t신호량으로 인해 두 개의 Doubango 응용 프로그램(idoubs)이 등록 메시지를 수신하는 것이 정상적이지 않습니다.최근에sip와 관련된 몇 가지를 연구하고 있습니다. 한 개의 idoubs가 아이폰에서 정상적으로 작동할 수 있지만 두 개를 동시에 실행하면 서버에 등록되지 않은 하나가 있습니다. 예를 들어 현재 두 개의 idoubs...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.