📄 sipp.cpp
字号:
} if (ptr>end_ptr) { return NULL ; } ptr = strchr(ptr, '='); if(!ptr) { ERROR("Invalid tag param in To: header"); } ptr ++; while((*ptr) && (*ptr != ' ') && (*ptr != ';') && (*ptr != '\t') && (*ptr != '\t') && (*ptr != '\r') && (*ptr != '\n') && (*ptr)) { tag[tag_i++] = *(ptr++); } tag[tag_i] = 0; return tag;}char * get_call_id(char *msg){ static char call_id[MAX_HEADER_LEN]; char * ptr1, * ptr2, backup; ptr1 = strstr(msg, "Call-ID:"); if(!ptr1) { ptr1 = strstr(msg, "Call-Id:"); } if(!ptr1) { ptr1 = strstr(msg, "Call-id:"); } if(!ptr1) { ptr1 = strstr(msg, "call-Id:"); } if(!ptr1) { ptr1 = strstr(msg, "call-id:"); } if(!ptr1) { ptr1 = strstr(msg, "CALL-ID:"); } if(!ptr1) { ERROR_P1("(1) No valid Call-ID: header in reply '%s'", msg); } ptr1 += 8; while((*ptr1 == ' ') || (*ptr1 == '\t')) { ptr1++; } if(!(*ptr1)) { ERROR("(2) No valid Call-ID: header in reply"); } ptr2 = ptr1; while((*ptr2) && (*ptr2 != ' ') && (*ptr2 != '\t') && (*ptr2 != '\r') && (*ptr2 != '\n')) { ptr2 ++; } if(!*ptr2) { ERROR("(3) No valid Call-ID: header in reply"); } backup = *ptr2; *ptr2 = 0; strcpy(call_id, ptr1); *ptr2 = backup; return (char *) call_id;}unsigned long get_reply_code(char *msg){ while((*msg != ' ') && (*msg != '\t')) msg ++; while((*msg == ' ') || (*msg == '\t')) msg ++; return atol(msg);}/*************************** I/O functions ***************************/#ifdef _USE_OPENSSLint recv_all_tls(SSL *ssl, char *buffer, int size, int trace_id){ int recv_size = 0; char * start_buffer = buffer; int to_be_recvd = size; int part_size ; recv_size = SSL_read(ssl,buffer, size); if(recv_size <= 0) { if(recv_size != 0) { nb_net_recv_errors++; WARNING_P3("TLS %d Recv error : size = %d,Dummy : %d ", trace_id, recv_size, trace_id); } else { /* This is normal for a server to have its client close * the connection */ if(toolMode != MODE_SERVER) { WARNING_P3("TLS %d Recv error : size = %d, dummy : %d " "remote host closed connection", trace_id, recv_size,trace_id); nb_net_recv_errors++; } } } return recv_size;}#endifint recv_all_tcp(int sock, char *buffer, int size, int trace_id){ int recv_size = 0; char * start_buffer = buffer; int to_be_recvd = size; int part_size ; do { part_size = recv(sock, start_buffer, to_be_recvd, 0); if(part_size > 0) { to_be_recvd -= part_size; start_buffer += part_size; recv_size += part_size; } else { recv_size = part_size; } } while((part_size > 0) && to_be_recvd); if(recv_size <= 0) { if(recv_size != 0) { nb_net_recv_errors++; WARNING_P3("TCP %d Recv error : size = %d, sock = %d", trace_id, recv_size, sock); WARNING_NO("TCP Recv error"); // ERROR_NO("TCP recv error"); } else {#ifdef __3PCC__ if (toolMode == MODE_3PCC_CONTROLLER_B) { /* In 3PCC controller B mode, twin socket is closed at peer closing. * This is a normal case: 3PCC controller B should end now */ ERROR("3PCC controller A has ended -> exiting"); } else#endif /* This is normal for a server to have its client close * the connection */ if(toolMode != MODE_SERVER) { WARNING_P3("TCP %d Recv error : size = %d, sock = %d, " "remote host closed connection", trace_id, recv_size, sock);#ifdef __3PCC__ if(sock == twinSippSocket || sock == localTwinSippSocket) { int L_poll_idx = 0 ; quitting = 1; for((L_poll_idx) = 0; (L_poll_idx) < pollnfds; (L_poll_idx)++) { if(pollfiles[L_poll_idx].fd == twinSippSocket) { pollset_remove(L_poll_idx); } if(pollfiles[L_poll_idx].fd == localTwinSippSocket) { pollset_remove(L_poll_idx); } } if(twinSippSocket) { shutdown(twinSippSocket, SHUT_RDWR); close(twinSippSocket); twinSippSocket = 0 ; } if(localTwinSippSocket) { shutdown(localTwinSippSocket, SHUT_RDWR); close(localTwinSippSocket); localTwinSippSocket = 0 ; } }#endif nb_net_recv_errors++; } } } return recv_size;}#ifdef _USE_OPENSSLint recv_tls_message(SSL * ssl, char *buffer, int buffer_size, E_Alter_YesNo alter_msg){ int len = 0; int recv_size; char * ctl_hdr; int content_length; len = recv_size = recv_all_tls(ssl, buffer, buffer_size, 1); if(recv_size <= 0) { return recv_size; } if(len >= buffer_size) { ERROR("TLS msg too big"); } buffer[len] = 0; return len;}#endif int recv_tcp_message(int sock, char *buffer, int buffer_size, E_Alter_YesNo alter_msg, E_Alter_YesNo isControlMsg = E_ALTER_NO){ int len = 0; int recv_size; char * ctl_hdr; int content_length; // Try to read SIP Header Message only // or CMD Message while(1) { // Read one char on tcp socket recv_size = recv_all_tcp(sock, &(buffer[len]), 1, 1); // Check read problem return if(recv_size <= 0) { return recv_size; } len++; // Search the end Message condition if (isControlMsg == E_ALTER_NO) { // In case of SIP Message \r\n follow by // \r\n is header end if((buffer[len-1] == '\n') && (buffer[len-2] == '\r') && (buffer[len-3] == '\n') && (buffer[len-4] == '\r')) { /* CRLF CRLF Detected */ buffer[len] = 0; break; } } else { // In case of CMD Message // escape char is the end of message if((alter_msg==E_ALTER_NO) && (buffer[len-1] == 27)) { /* End delimitor detected, stop receiving */ buffer[len-1] = 0; return (len - 1); } } } if(len >= buffer_size) { ERROR("TCP msg too big"); } // Now search the content length of the body // part of SIP or CMD Message ctl_hdr = strstr(buffer, "Content-Length:"); if(!ctl_hdr) ctl_hdr = strstr(buffer, "Content-length:"); if(!ctl_hdr) ctl_hdr = strstr(buffer, "content-Length:"); if(!ctl_hdr) ctl_hdr = strstr(buffer, "content-length:"); if(!ctl_hdr) ctl_hdr = strstr(buffer, "CONTENT-LENGTH:"); // Content Length was found // Read its value if((ctl_hdr) && (alter_msg==E_ALTER_YES)) { ctl_hdr += 15; content_length = atoi(ctl_hdr); } else { content_length = 0; } // If a body exist read it if(content_length) { /* Ensure remaining content will fit in remaining buffer size */ if(content_length > (buffer_size - len)) { ERROR("TCP msg too big"); } // Read Body part do { recv_size = recv_all_tcp(sock, &(buffer[len]), content_length, 2); if(recv_size <= 0) { return recv_size; } len += recv_size; content_length -= recv_size; } while(content_length); } // Add the final '\0' buffer[len] = 0; return len;}int decompress_if_needed(int sock, char *buff, int len, void **st){ if(compression && len) { struct timeval currentTime; GET_TIME (¤tTime); TRACE_MSG((s, "----------------------------------------------- %s\n" "Compressed message received, header :\n" "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x " "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", CStat::instance()->formatTime(¤tTime), buff[0] , buff[1] , buff[2] , buff[3], buff[4] , buff[5] , buff[6] , buff[7], buff[8] , buff[9] , buff[10], buff[11], buff[12], buff[13], buff[14], buff[15])); int rc = comp_uncompress(st, buff, (unsigned int *)&len); switch(rc) { case COMP_OK: TRACE_MSG((s,"Compressed message decompressed properly.\n")); break; case COMP_REPLY: TRACE_MSG((s, "Compressed message KO, sending a reply (resynch).\n")); sendto(sock, buff, len, 0, (sockaddr *)(void *)&remote_sockaddr, SOCK_ADDR_SIZE(&remote_sockaddr)); resynch_send++; return 0; case COMP_DISCARD: TRACE_MSG((s, "Compressed message discarded by pluggin.\n")); resynch_recv++; return 0; default: case COMP_KO: ERROR("Compression pluggin error"); return 0; } } return len;}void sipp_customize_socket(int s){ unsigned int buffsize = 65535; /* Allows fast TCP reuse of the socket */#ifdef _USE_OPENSSL if (transport == T_TCP || transport == T_TLS ) { #else if (transport == T_TCP) { #endif int sock_opt = 1; if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *)&sock_opt, sizeof (sock_opt)) == -1) { ERROR_NO("setsockopt(SO_REUSEADDR) failed"); }#ifndef SOL_TCP#define SOL_TCP 6#endif if (setsockopt (s, SOL_TCP, TCP_NODELAY, (void *)&sock_opt, sizeof (sock_opt)) == -1) { { ERROR_NO("setsockopt(TCP_NODELAY) failed"); } } { struct linger linger; linger.l_onoff = 1; linger.l_linger = 1; if (setsockopt (s, SOL_SOCKET, SO_LINGER, &linger, sizeof (linger)) < 0) { ERROR_NO("Unable to set SO_LINGER option"); } } } /* Increase buffer sizes for this sockets */ if(setsockopt(s, SOL_SOCKET, SO_SNDBUF, &buffsize, sizeof(buffsize))) { ERROR_NO("Unable to set socket sndbuf"); } buffsize = 65535; if(setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buffsize, sizeof(buffsize))) { ERROR_NO("Unable to set socket rcvbuf"); } } #ifdef _USE_OPENSSLint send_message_tls(SSL *ssl, void ** comp_state, char * msg){ int rc; rc = send_nowait_tls(ssl, msg, strlen(msg), 0); if(rc == 0) { nb_net_send_errors++; ERROR_NO("Unable to send TLS message"); return -2; } return rc;}#endifint send_message(int s, void ** comp_state, char * msg){ struct sockaddr_storage *L_dest = &remote_sockaddr; if(transport == T_TCP) { int rc; rc = send_nowait(s, msg, strlen(msg), 0); #ifdef EAGAIN if(errno == EAGAIN) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -