LINUX.ORG.RU

Трабла с сокетами


0

0

Доброго всем времени суток!

Разрабатываю SIP User Agent и использую библиотеку [url=http://download.savannah.gnu.org/releases/exosip/libeXosip-0.9.0.tar.gz]eXo sip 0.9.0[/url]. При получении информации об Online-статусе контакта считываются не все данные. Прошёлся отладчиком и локализовал проблему. Но не могу ничего понять. recvfrom считывает не все данные! Как такое может быть? Можно было бы подумать, что они и не приходят, так Ethereal же не обманешь! :???:

[ccode] // udp.c .... /* if second==-1 && useconds==-1 -> wait for ever if max_message_nb<=0 -> infinite loop.... */ int eXosip_read_message ( int max_message_nb, int sec_max, int usec_max ) { fd_set osip_fdset; struct timeval tv; char *buf; tv.tv_sec = sec_max; tv.tv_usec = usec_max; buf = (char *)osip_malloc(SIP_MESSAGE_MAX_LENGTH*sizeof(char)+1); while (max_message_nb!=0 && eXosip.j_stop_ua==0) { int i; int max; int wakeup_socket = jpipe_get_read_descr(eXosip.j_socketctl); FD_ZERO(&osip_fdset); #if defined (WIN32) || defined (_WIN32_WCE) FD_SET((unsigned int)eXosip.j_socket, &osip_fdset); #else FD_SET(eXosip.j_socket, &osip_fdset); #endif max = eXosip.j_socket; #if defined (WIN32) || defined (_WIN32_WCE) FD_SET((unsigned int)wakeup_socket, &osip_fdset); #else FD_SET(wakeup_socket, &osip_fdset); #endif if (wakeup_socket>eXosip.j_socket) max = wakeup_socket; if ((sec_max==-1)||(usec_max==-1)) i = select(max+1, &osip_fdset, NULL, NULL, NULL); else i = select(max+1, &osip_fdset, NULL, NULL, &tv); if ((i == -1) && (errno == EINTR || errno == EAGAIN)) continue; if ((i > 0) && FD_ISSET (wakeup_socket, &osip_fdset)) { char buf2[500]; jpipe_read (eXosip.j_socketctl, buf2, 499); }

if (0==i || eXosip.j_stop_ua!=0) { } else if (-1==i) { osip_free(buf); return -2; /* error */ } else if (FD_ISSET (eXosip.j_socket, &osip_fdset)) { struct sockaddr_in sa; #ifdef __linux socklen_t slen; #else int slen; #endif slen = sizeof(struct sockaddr_in); /* Вот в следующей строчке считывается код медода NOTIFY, но только до Content-Length, т.е. XML не считывается */ i = recvfrom (eXosip.j_socket, buf, SIP_MESSAGE_MAX_LENGTH, 0, (struct sockaddr *) &sa, &slen); if( i > 5 ) /* we expect at least one byte, otherwise there's no doubt that it is not a sip message !*/ { /* Message might not end with a "\0" but we know the number of */ /* char received! */ osip_transaction_t *transaction = NULL; osip_event_t *sipevent; osip_strncpy(buf+i,"\0",1); OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_INFO1,NULL, "Received message: \n%s\n", buf)); #ifdef WIN32 if (strlen(buf)>412) { OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_INFO1,NULL, "Message suite: \n%s\n", buf+412)); } #endif

sipevent = osip_parse(buf, i); transaction = NULL; if (sipevent!=NULL&&sipevent->sip!=NULL) { osip_message_fix_last_via_header(sipevent->sip, inet_ntoa (sa.sin_addr), ntohs (sa.sin_port)); i = osip_find_transaction_and_add_event(eXosip.j_osip, sipevent); if (i!=0) { /* this event has no transaction, */ OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_INFO1,NULL, "This is a request\n", buf));

[/ccode]

Сами данные имею примерно такой вид:

[code] NOTIFY sip:pafnuty@lecturehall21.academy.ru SIP/2.0 Via SIP/2.0/TCP dist.probablilty.org:5060 ;branch=z9hG4bK4321 Max-Forwards: 70 To: P. L. Chebychev <sip:chebychev@academy.ru>;tag=21171 From: M. Poisson <sip:poisson@probability.org>;tag=25140 Call-ID: 58dkfj34924lk34452k592520 CSeq: 1026 NOTIFY Allow: ACK, INVITE, CANCEL, BYE, NOTIFY, SUBSCRIBE, MESSAGE Allow-Events: dialog Contact: <sip:s.possion@dist.probability.org;transport=tcp> Subscription-State: active;expires=3600 Event: presence Content-Type: application/cpim-pidf+xml Content-Length: 244

<?xml version="1.0" encoding="UTF-8"?> <presence xmlns="urn:ietf:params:xml:ns:cpim-pidf" entity="sip:poisson@probability.org"> <tuple id="452426775"> <status> <basic>closed</basic> </status> </tuple> </presence>

[/code] P.S. определён как #define SIP_MESSAGE_MAX_LENGTH 4000

★★

толи не влазит в буффер толи надо смотреть в сторону MSG_WAITALL

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.