/* * Get line from naked TCP stream. */ static int GetLine(TCPSOCKET * sock, char * line, uint16_t size) { int rc = 0; uint8_t to_cnt = 0; int got; char *cp = line; if (size > 0) { for (;;) { if ((got = NutTcpReceive(sock, cp, 1)) <= 0) { if (got == 0 && to_cnt++ < 10) continue; rc = got; printf("[GL-TO]"); break; } if (*cp == '\n') { *cp = 0; break; } if (*cp != '\r' && rc < (int) size) { rc++; cp++; } } } return rc; }
int clientReceive(TCPSOCKET *sock, char *buffer, int len){ int got; got = NutTcpReceive(sock, buffer, len); if (got <= 0) { LogMsg_P(LOG_INFO, PSTR("Fout bij ontvangen client data")); } return got; }
THREAD(bin_cmd_thread0, arg) { uint8_t count = 0; TCPSOCKET * sock; char buff[256]; uint32_t time = 15000; NutThreadSetPriority(TCP_BIN_SERVER_PRI); if(THISINFO)printf("CMD:Thraed running...\r\n"); while(1) { //if(THISINFO)printf("Start Create Socket(%d)\r\n",count++); sock = NutTcpCreateSocket(); if(sock == 0) { if(THISERROR)printf("CMD:Create socket failed!\r\n"); continue; } NutTcpSetSockOpt(sock,SO_RCVTIMEO,&time,sizeof(uint32_t)); if(THISINFO)printf("CMD: NutTcpAccept at port %d\r\n",gwork_port); if(NutTcpAccept(sock,gwork_port)) { NutTcpCloseSocket(sock); if(THISERROR)printf("CMD:NutTcpAccept Timeout! NutTcpCloseSocket and reaccept.\r\n"); continue; } if(THISINFO)printf("CMD:Tcp Accept one connection.\r\n"); count = 0; while(1) { int len = NutTcpReceive(sock,buff,sizeof(buff)); if(len == 0) { if(THISINFO)printf("Tcp Recieve timeout.\r\n"); if(++count == 1) { if(THISINFO)printf("Tcp Send Io Out Data.\r\n"); //NutTcpSend(sock,"OK",strlen("OK")); { //都继电器状态的模拟请求。 uint8_t buffer[sizeof(CmdHead)] = {0x01,0x00,0x00,0x00,0x00,0x00,0x00}; CmdGetIoOutValue(sock,(CmdHead *)buffer,sizeof(buffer)); } } if(++count >= 3) { if(THISINFO)printf("Close Command Socket\r\n"); break; } } else if(len == -1) { int error = NutTcpError(sock); if(THISERROR)printf("CMD:Tcp Receive ERROR(%d)\r\n",error); if(error == ENOTCONN) { if(THISERROR)printf("CMD:Socket is not connected,break connecting\r\n"); break; } else { if(THISERROR)printf("CMD:Socket is unknow error,break connecting\r\n"); break; } } else if(len > 0) { //printf("Get One Tcp packet length(%d)\r\n",len); BinCmdPrase(sock,buff,len); } } NutTcpCloseSocket(sock); } }
/* * Process embedded meta data. */ static char *ReadMetaTitle(TCPSOCKET * sock, uint32_t iv) { uint8_t blks = 0; uint16_t cnt; int got; int rc = 0; char *title = 0; char *buf; char *mn1; char *mn2; char *md1; char *md2; /* Allocate temporary buffer. */ if ((buf = malloc(512 + 1)) == 0) { return 0; } for (cnt = 512; iv; iv -= got) { if (iv < 512) cnt = iv; if ((got = NutTcpReceive(sock, buf, cnt)) <= 0) break; } if (iv == 0) { /* Get the number of meta data blocks. */ if ((got = NutTcpReceive(sock, &blks, 1)) == 1) { if (blks && blks <= 32) { /* Receive the metadata block. */ for (cnt = blks * 16; cnt; cnt -= got) { if ((got = NutTcpReceive(sock, buf + rc, cnt)) < 0) break; rc += got; buf[rc] = 0; } if (cnt == 0) { mn1 = buf; while (mn1) { if ((mn2 = strchr(mn1, ';')) != 0) *mn2++ = 0; if ((md1 = strchr(mn1, '=')) != 0) { *md1++ = 0; while (*md1 == ' ' || *md1 == '\'') md1++; if ((md2 = strrchr(md1, '\'')) != 0) *md2 = 0; if (strcasecmp(mn1, "StreamTitle") == 0) { title = malloc(strlen(md1) + 1); strcpy(title, md1); break; } } mn1 = mn2; } } } else printf("[ML=%u]", blks); } } else puts("[SMFAIL]"); free(buf); return title; }