v831-T113-c-udp发送篇

发布时间 2023-07-31 15:11:35作者: 悠闲的小莫

又来分析udp,目标是从v831中获取到的图片信息发送给t113然后再屏幕上显示出来

挫折一

t113作为服务端,再接收到客户端发来的数据后会自动设置clinetaddr,那么我们就不再需要取从新aton这个ip地址了,直接使用clientaddr

int udp_send(void)
{
	// if (0 == inet_aton("192.168.1.118", &tSocketClientAddr.sin_addr)){
	// 	printf("invalid server_ip\n");
	// 	return -1;
	// }
	// printf("aton\n");
    iAddrLen = sizeof(struct sockaddr);
    iRecvLen = sendto(iSocketServer, "ok", 3, 0,
										 (struct sockaddr *)&tSocketClientAddr, iAddrLen);
    if (iRecvLen < 0)
    {
        printf("send error \n");
		return -1;
    }
	// printf("send\n");
    return 0;
}

int udp_rec(unsigned char *ucRecvBuf)
{
	int size;
    iAddrLen = sizeof(struct sockaddr);
    iRecvLen = recvfrom(iSocketServer, ucRecvBuf, 240*240*3, 0, (struct sockaddr *)&tSocketClientAddr, &iAddrLen);
    if (iRecvLen > 0)
    {
        ucRecvBuf[iRecvLen] = '\0';
        printf("Get Msg From %s : \n", inet_ntoa(tSocketClientAddr.sin_addr));
		for(size=0;size<iRecvLen;size++)
		{
			printf("%x",ucRecvBuf[size]);
		}
    }
    else{
        return -1;
    }
    return 0;
}

挫折二

sendto,这个函数再tcp中是会自动拆分的,因为最大数据包的问题,不可能全部数据一贞发送完,但是再udp中就不会自动拆分,所以在程序中我们应该手动拆分帧。根据百度的结果最大数据长度为:

int upd_send()
{
	int iSocketClient;
	struct sockaddr_in tSocketServerAddr;
	struct sockaddr_in tSocketClientAddr;

	libmaix_err_t err;

	
	int iRet;
	unsigned char ucSendBuf[1000];
	int iSendLen;
	int iAddrLen;

	printf("\r\nsize is %d\r\n",cam->fram_size);
	iSocketClient = socket(AF_INET, SOCK_DGRAM, 0);

	tSocketServerAddr.sin_family      = AF_INET;
	tSocketServerAddr.sin_port        = htons(SERVER_PORT);  /* host to net, short */
 	//tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;
 	if (0 == inet_aton(ip_add, &tSocketServerAddr.sin_addr))
 	{
		printf("invalid server_ip\n");
		return -1;
	}
	memset(tSocketServerAddr.sin_zero, 0, 8);
	err = cam->start_capture(cam);
	if(err != LIBMAIX_ERR_NONE){
		printf("start capture fail: %s\n", libmaix_get_err_msg(err));
		return -1;
	}
	while (1)
	{
		err = cam->capture_image(cam,&img);
		if(err != LIBMAIX_ERR_NONE)
        {
            // not ready, sleep to release CPU
            if(err == LIBMAIX_ERR_NOT_READY)
            {
                usleep(20 * 1000);
                continue;
            }
            else
            {
                printf("capture fail: %s\n", libmaix_get_err_msg(err));
                break;
            }
        }
		iAddrLen = sizeof(struct sockaddr);
		printf("data size is %d\r\n",sizeof(img->data));
		iSendLen = sendto(iSocketClient, img->data,65507, 0,
								(const struct sockaddr *)&tSocketServerAddr, iAddrLen);
		if (iSendLen <= 0)
		{
			close(iSocketClient);
			return -1;
		}
		while(( recvfrom(iSocketClient, ucSendBuf, 999, 0, (struct sockaddr *)&tSocketClientAddr, &iAddrLen))<=0);
		if(strcmp(ucSendBuf,"ok"))
		{
			printf("no ok \n");
			printf("%s\n\n",ucSendBuf);
			close(iSocketClient);
			break;
		}
		printf("ok \n");
	}

	return 0;
}