200 ok响应中没有携带SDP,但是183和invite响应都携带了SDP,此时SDP是否协商成功?该怎么判断?
时间: 2024-04-13 12:24:47 浏览: 290
在你描述的情况下,如果183和INVITE响应中携带了SDP,而200 OK响应中没有携带SDP,这意味着SDP协商成功。
为了判断SDP是否协商成功,你可以考虑以下几个方面:
1. 检查SDP中的连接信息("c="字段)和媒体描述("m="字段),确保它们与期望的一致。这些字段提供了媒体流的IP地址、端口和传输协议等信息。如果SDP中的连接信息和媒体描述与你预期的一致,那么可以认为SDP协商成功。
2. 验证183 Session Progress响应中的SDP是否包含了被叫用户的媒体流描述信息。这样主叫用户可以根据收到的SDP开始发送媒体流。
3. 在INVITE响应中,被叫用户可以将自己的媒体流描述信息(如音频和视频编解码器选项)通过SDP发送给主叫用户。主叫用户可以解析这些信息,并根据需要配置自己的媒体流。
总之,如果183和INVITE响应中携带了SDP,并且SDP中的连接信息和媒体描述与预期的一致,那么可以判断SDP协商成功。请注意,200 OK响应没有携带SDP并不表示协商失败,它可能只是在确认会话建立时省略了SDP的传输。
相关问题
sip中的183携带SDP,需要回复200ok携带SDP吗
在SIP中,当收到一个INVITE请求后,如果被叫用户正在被振铃,主叫用户会收到一个SIP 183 Session Progress响应。这个响应可以携带SDP(Session Description Protocol),其中包含了媒体流的描述信息。
根据SIP协议规范,当主叫用户收到183响应时,可以选择性地回复一个200 OK响应,也可以继续等待最终的200 OK响应。如果主叫用户希望与被叫用户进行媒体通信,且已经准备好发送媒体流,则可以在183响应之后立即回复一个200 OK响应,并在其中携带SDP。这样可以加快媒体通信的建立。
但是,根据具体的业务需求和实现方式,是否需要回复200 OK携带SDP是可以灵活决定的。某些情况下,主叫用户可能会选择继续等待被叫用户的200 OK响应,并在该响应中携带SDP。这取决于系统设计和业务要求。
用C语言写一个程序,向网络摄像机发送带有SDP信息的invite消息,收到相机回复的200 OK后,向网络摄像机发送ACK和BYE信令
这里提供一个简单的示例程序,基于libcurl库实现。其中,SDP信息需要根据实际情况自行修改。
```c
#include <stdio.h>
#include <curl/curl.h>
static size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
// 响应数据回调函数,这里可以打印出收到的响应数据
printf("%s", ptr);
return size * nmemb;
}
int main()
{
CURL *curl;
CURLcode res;
struct curl_slist *headers = NULL;
char *invite_url = "sip:192.168.1.100:5060";
char *sdp_info = "v=0\r\no=alice 2890844526 2890842807 IN IP4 192.168.1.101\r\ns=-\r\nc=IN IP4 192.168.1.101\r\nt=0 0\r\nm=video 20000 RTP/AVP 96\r\na=rtpmap:96 H264/90000\r\na=sendonly\r\n";
char *ack_url = "sip:192.168.1.100:5060;transport=udp";
char *bye_url = "sip:192.168.1.100:5060;transport=udp";
char *body = NULL;
long body_len = 0;
struct curl_slist *send_headers = NULL;
char *content_type = "Content-Type: application/sdp";
char *invite_method = "INVITE";
char *ack_method = "ACK";
char *bye_method = "BYE";
// 初始化libcurl库
curl_global_init(CURL_GLOBAL_ALL);
// 创建curl句柄
curl = curl_easy_init();
if (curl) {
// 设置请求头
headers = curl_slist_append(headers, "User-Agent: mycurl");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
// 发送invite请求
curl_easy_setopt(curl, CURLOPT_URL, invite_url);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, invite_method);
send_headers = curl_slist_append(send_headers, content_type);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, send_headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, sdp_info);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(sdp_info));
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
// 发送ack请求
curl_easy_setopt(curl, CURLOPT_URL, ack_url);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, ack_method);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
// 发送bye请求
curl_easy_setopt(curl, CURLOPT_URL, bye_url);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, bye_method);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
// 清理资源
curl_slist_free_all(headers);
curl_slist_free_all(send_headers);
curl_easy_cleanup(curl);
}
// 释放libcurl库
curl_global_cleanup();
return 0;
}
```
需要注意的是,这里使用的是libcurl库发送HTTP请求,而不是直接使用协议栈发送SIP信令。因此,需要根据实际情况修改请求的URL、请求方法、请求头、请求体等内容,以及处理响应的回调函数。同时,由于网络摄像机的SIP协议栈可能不支持某些HTTP方法或请求头,因此需要根据实际情况进行测试和调试。
阅读全文