#define BUF_MAX_SIZE 220*1024
int createUdpSocket(char *ip, int port)
{
int sockfd;
int on = 1;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
return -1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on));
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
if (NULL == ip)
{
addr.sin_addr.s_addr = htonl(INADDR_ANY);
}
else
{
addr.sin_addr.s_addr = inet_addr(ip);
}
if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0)
{
rl_log_err("connect failed, exit !\n");
return -1;
}
return sockfd;
}
static void* Rtsp_forward_thread(void *arg)
{
……
int sockfd;
int rtpSockfd, rtcpSockfd;
……
int port = 55532;
rtpSockfd = createUdpSocket(NULL, port);
if (rtpSockfd < 0)
{
rl_log_err("create rtpSocket failed!");
pthread_detach(pthread_self());
return NULL;
}
rtspInfo.rtp_port = get_sock_port(rtpSockfd);
if (rtspInfo.rtp_port < 0)
{
rl_log_err("get rtp port failed!");
pthread_detach(pthread_self());
return NULL;
}
//设置超时
struct timeval timeout={1,0};
setsockopt(rtpSockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));
int n = 220 * 1024;
setsockopt(rtpSockfd, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n));
char* rBuf = (char*)malloc(BUF_MAX_SIZE);
if (rtspInfo.isTcp)
{
……
} else {
struct sockaddr serverAddr;
int len = sizeof(serverAddr);
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr) );
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("XXX.XXX.XXX.XXX");
servaddr.sin_port = htons(60590);
char *tmp = NULL;
while (1)
{
rl_memset(rBuf, 0, BUF_MAX_SIZE);
ret = recvfrom(rtpSockfd, rBuf, BUF_MAX_SIZE, 0, (struct sockaddr *)&serverAddr, &len);
rl_log_info("recv rtp buf ret %d rbuf %d \n", ret, strlen(rBuf));
}
}
}
尝试增大buff缓冲区
#define BUF_MAX_SIZE 220*1024
setsockopt(rtpSockfd, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n));
没有效果
接收数据长度和返回值一致
你好,不知道你传输的是什么内容呢,个人推测可能是传输的内容中包含'\0',以至于strlen计算字符串长度时提前结束了,导致长度与返回值不一致
如果数据部分不是一个完整的字符串,数据部分中间有'\0',接收数据长度和返回值不一致是正常的。
strlen函数返回的是 从入参指针开始到遇到'\0'时的长度。
recvfrom函数返回的是收到的udp数据包整个数据部分的长度。
可以用wireshark抓包看看整个udp包是怎样的。