socket udp recvfrom 接收的字符数据长度远小于返回值
用代码块功能插入代码,请勿粘贴截图
#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));
没有效果
我想要达到的结果
接收数据长度和返回值一致