首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SIP注册问题

SIP注册问题
EN

Stack Overflow用户
提问于 2012-02-13 16:36:00
回答 3查看 1.1K关注 0票数 0

我目前正在开发SIP示例应用程序。

我正在尝试在Unix上使用基于C的套接字编程进行注册。我已经能够成功地获得注册到PJSIP,但当相同的参数,我正在发送与正常套接字编程,然后我不能从服务器收到任何响应。

源代码如下:

代码语言:javascript
运行
复制
char *server = (char *)serverAddress; // First arg: server address/name
char *echoString = "Request msg REGISTER/cseq=46476 (tdta0x8857200)\r\nREGISTER sip:DOMAIN_NAME SIP/2.0\r\nVia: SIP/2.0/UDP 192.168.1.120:51648;rport;branch=z9hG4bKPjwEt4VvIVdjIJKRmEJbkidYDAu-zQbIqv\r\nMax-Forwards: 70\r\nFrom: <sip:USER_NAME@DOMAIN_NAME>;tag=epCBN7JXsQE1nnI5d5SOZe9a5ujRyI67\r\nTo: <sip:USER_NAME@DOMAIN_NAME>\r\nCall-ID: .5yYCqh2jEYdy5T4kxhzxwDYEkCO1XlD\r\nCSeq: 46476 REGISTER\r\nContact: <sip:USER_NAME@192.168.1.120:51648;ob>\r\nExpires: 300\r\nAllow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS\r\nAuthorization: Digest username=\"USER_NAME\", realm=\"asterisk\", nonce=\"3b63254c\", uri=\"sip:DOMAIN_NAME\", response=\"9e8fc78829d143a58fba5a79f6ad44fd\", algorithm=MD5\r\nContent-Length:  0"; 


size_t echoStringLen = strlen(echoString);


// Third arg (optional): server port/service
char *servPort = (char *)service;

// Tell the system what kind(s) of address info we want
struct addrinfo addrCriteria;                      // Criteria for address match
memset(&addrCriteria, 0, sizeof(addrCriteria));    // Zero out structure
addrCriteria.ai_family = AF_UNSPEC;                // For the following fields, a zero value means 
                                                   // Any address family "don't care"


addrCriteria.ai_socktype = SOCK_DGRAM; // Only datagram sockets
addrCriteria.ai_protocol = IPPROTO_UDP;         // Only UDP protocol
// Get address(es)
struct addrinfo *servAddr; // List of server addresses
int rtnVal = getaddrinfo(server, servPort, &addrCriteria, &servAddr);
if (rtnVal != 0)
    DieWithUserMessage("getaddrinfo() failed", gai_strerror(rtnVal));
// Create a datagram/UDP socket
int sock = socket(servAddr->ai_family, servAddr->ai_socktype,
                  servAddr->ai_protocol); // Socket descriptor for client
if (sock < 0)
    DieWithSystemMessage("socket() failed");
// Send the string to the server
ssize_t numBytes = sendto(sock, echoString, echoStringLen, 0,
                          servAddr->ai_addr, servAddr->ai_addrlen);
if (numBytes < 0)
    DieWithSystemMessage("sendto() failed");
else if (numBytes != echoStringLen)
    DieWithUserMessage("sendto() error", "sent unexpected number of bytes");
// Receive a response
struct sockaddr_storage fromAddr; // Source address of server
// Set length of from address structure (in-out parameter)
socklen_t fromAddrLen = sizeof(fromAddr);
char buffer[100 + 1]; // I/O buffer
numBytes = recvfrom(sock, buffer, 100, 0,
                    (struct sockaddr *) &fromAddr, &fromAddrLen);
if (numBytes < 0)
    DieWithSystemMessage("recvfrom() failed");
else if (numBytes != 100)
    DieWithUserMessage("recvfrom() error", "received unexpected number of bytes");
// Verify reception from expected source

int value = SockAddrsEqual(servAddr->ai_addr, (struct sockaddr *) &fromAddr);
if (value == 0)
    DieWithUserMessage("recvfrom()", "received a packet from unknown source");
freeaddrinfo(servAddr);
buffer[echoStringLen] = '\0';     // Null-terminate received data
printf("Received: %s\n", buffer); // Print the echoed string

close(sock);
exit(0);

当我尝试调试代码时,断点从recvfrom方法调用中消失,如下所示。

代码语言:javascript
运行
复制
numBytes = recvfrom(sock, buffer, 100, 0, (struct sockaddr *) &fromAddr, &fromAddrLen);

提前感谢您的合作。

EN

回答 3

Stack Overflow用户

发布于 2012-02-13 20:44:43

如果您没有收到来自注册服务器的响应,很可能是因为它无法理解您发送的注册请求,或者将其作为副本拒绝。更有可能的是,您需要更复杂地了解如何构造REGISTER请求,而不是简单地发送硬编码字符串。

除此之外,您可以尝试将所需的\r\n\r\n添加到echoString的末尾。所有SIP请求都需要以双行换行结束标题部分,而您的字符串中缺少双行换行。

票数 0
EN

Stack Overflow用户

发布于 2012-02-14 06:47:34

除非将套接字设置为非阻塞,否则recvfrom()会一直阻塞,直到收到响应为止。一种更好的方法是使用带超时的select() (比如一两秒)。更好的做法是将整个过程放入一个循环中,该循环会重试一些次数(比如三到四次)。

请记住,UDP不能保证您的数据报将被传送:当您等待足够长的时间并需要重试时,完全由您决定。

另外,检查getaddrinfo()servAddr中设置的值是否有意义。如果地址或端口号错误,您的数据包可能会自动消失。

票数 0
EN

Stack Overflow用户

发布于 2012-02-15 13:29:47

如果您确认这是套接字问题,则可以进行跟踪。

但是,如果您不确定,那么对于此类问题,请使用网络分析应用程序(wireshark) &查看您发送和接收的数据包。然后查看套接字问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9257549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档