v831-T113-c-udp发送篇
又来分析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;
}