C++ ssdp协议打印接收的返回打印不全怎么优化
时间: 2023-12-18 20:06:04 浏览: 55
ssdp协议以太网报文,可以用wireshark软件打开
5星 · 资源好评率100%
可能是由于一次接收的数据长度超过了你所设置的缓冲区大小或者缓冲区不够大,导致数据被截断了。你可以尝试增大缓冲区的大小或者使用循环接收数据的方式,以确保能够接收到完整的数据。以下是一个简单的示例代码,可以实现循环接收 SSDP 协议返回的数据并打印出完整的数据:
```cpp
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define SSDP_PORT 1900
#define SSDP_BUF_SIZE 4096
int main()
{
int sockFd;
struct sockaddr_in addr;
char buf[SSDP_BUF_SIZE];
sockFd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockFd < 0) {
perror("socket error");
return -1;
}
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(SSDP_PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockFd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind error");
close(sockFd);
return -1;
}
while (1) {
int len = recv(sockFd, buf, sizeof(buf) - 1, 0);
if (len < 0) {
perror("recv error");
continue;
}
buf[len] = '\0';
printf("%s", buf);
}
close(sockFd);
return 0;
}
```
注意,SSDP 协议返回的数据可能包含多个消息,每个消息以空行分隔,因此你需要根据空行来分隔每个消息。
阅读全文