void act_nopen_a(int8 type, int8 save, uint16 sport, uint8 *dip, uint16 dport) { int8 ret, sock, i; for(i=ATC_SOCK_NUM_START; i<=ATC_SOCK_NUM_END; i++) { if(sockstat[i] != SOCK_STAT_IDLE && sockport[i] == sport) { DBGA("src port(%d) is using now by sock(%d)", sport, i); MAKE_TCMD_DIGIT(atci.tcmd.arg1, 2); CMD_RESP_RET(RET_WRONG_ARG, VAL_NONE); } } if(save == 'S' || save == 'A') { } if(save == 'O' || save == 'A') { if(type == 'S') { sock = sock_get(SOCK_STAT_TCP_SRV, sport); if(sock == RET_NOK) CMD_RESP_RET(RET_NO_SOCK, VAL_NONE); ret = TCPServerOpen(sock, sport); if(ret != RET_OK) CMD_RESP_RET(RET_UNSPECIFIED, VAL_NONE); sockwatch_set(sock, WATCH_SOCK_CONN_EVT); CMD_RESP_RET(RET_OK, sock); } else if(type == 'C') { sock = sock_get(SOCK_STAT_TCP_CLT, sport); if(sock == RET_NOK) CMD_RESP_RET(RET_NO_SOCK, VAL_NONE); ret = TCPCltOpenNB(sock, sport, dip, dport); if(ret != RET_OK) { DBGA("TCPCltOpenNB fail - ret(%d)", ret); CMD_RESP_RET(RET_WRONG_ADDR, VAL_NONE); } sockwatch_set(sock, WATCH_SOCK_CONN_TRY); sockbusy[sock] = VAL_TRUE; CMD_RESP_RET(RET_ASYNC, sock); } else { if(dip != NULL) { memcpy(udpip[sock], dip, 4); udpport[sock] = dport; } sock = sock_get(SOCK_STAT_UDP, sport); if(sock == RET_NOK) CMD_RESP_RET(RET_NO_SOCK, VAL_NONE); UDPOpen(sock, sport); sockwatch_set(sock, WATCH_SOCK_RECV); CMD_RESP_RET(RET_OK, sock); } } }
//processing http protocol , and excuting the followed fuction. void WebServer(uint8 s) { int ret; uint32 header_len=0, content_len=0, received_len=0; char sub[10]; /* http service start */ ret = TCPRecv(s, (int8*)rx_buf, MAX_URI_SIZE); if(ret > 0){ // If Received.. *(((uint8*)rx_buf)+ret) = '\0'; if(strstr(rx_buf, "Content-Length: ")){ mid((char*)rx_buf, "Content-Length: ", "\r\n", sub); content_len=atoi(sub); header_len = (uint32)(strstr(rx_buf, "\r\n\r\n") - rx_buf + 4); received_len = ret; while(received_len!=(content_len+header_len)) { ret = TCPRecv(s, (int8*)rx_buf+received_len, MAX_URI_SIZE); received_len+=ret; } *(((uint8*)rx_buf)+received_len) = '\0'; } HTTPProcessor(s, (char*)rx_buf); // request is processed memset(rx_buf,0x00,MAX_URI_SIZE); TCPDisconnect(s); } else if(ret == SOCKERR_NOT_TCP){ // Not TCP Socket, It's UDP Socket DBG("UDP Socket Close"); UDPClose(s); } else if(ret == SOCKERR_CLOSED){ // Socket Closed LOGA("HTTP Server Started - ch(%d)",(uint16)s); TCPServerOpen(s, DEFAULT_HTTP_PORT); } if(GetTCPSocketStatus(s) == SOCKERR_CLOSE_WAIT){// Close waiting TCPClose(s); } }
void loopback_tcps(uint8 ch, uint16 port) { int ret; int SendLen, ReSendLen; ret = TCPRecv(ch, data_buf, TX_RX_MAX_BUF_SIZE); if(ret > 0) { // Received SendLen = TCPSend(ch, data_buf, ret); if(SendLen < ret) { while(SendLen != ret) { ReSendLen = TCPReSend(ch); if(ReSendLen > 0) { SendLen += ReSendLen; } else if(ReSendLen == ERROR_WINDOW_FULL) { LOG("Window Full"); TCPClose(ch); DBG("TCP Socket Close"); while(1); } else { break; } } } } else if(ret == ERROR_NOT_TCP_SOCKET) { // Not TCP Socket, It's UDP Socket DBG("UDP Socket Close"); UDPClose(ch); } else if(ret == ERROR_CLOSED) { // Socket Closed LOGA("TCP Loop-Back Started - ch(%d)",(uint16)ch); TCPServerOpen(ch, port); } if(GetTCPSocketStatus(ch) == STATUS_CLOSE_WAIT) { // Close waiting TCPClose(ch); } }
/** * @brief This function listenes the eventing message from IGD(Internet Gateway Device). */ void eventing_listener( SOCKET sockfd /**< a socket number. */ ) { uint16 len; const uint8 HTTP_OK[] = "HTTP/1.1 200 OK\r\n\r\n"; switch (getSn_SR(sockfd)) { case SOCK_ESTABLISHED: /* if connection is established */ Delay_ms(500); if((len = getSn_RX_RSR(sockfd)) > 0){ TCPRecv(sockfd, (void *)recv_buffer, len); TCPSend(sockfd, (void *)HTTP_OK, strlen((void *)HTTP_OK)); parseEventing(recv_buffer); #ifdef UPNP_DEBUG printf("\r\nReceiveData\r\n%s\r\n", recv_buffer); #endif } break; case SOCK_CLOSE_WAIT: /* If the client request to close */ if ((len = getSn_RX_RSR(sockfd)) > 0) /* check Rx data */ { TCPRecv(sockfd, (void *)recv_buffer, len); /* read the received data */ } TCPClose(sockfd); break; case SOCK_CLOSED: /* if a socket is closed */ if(TCPServerOpen(sockfd,PORT_UPNP_EVENTING) == FAIL) /* reinitialize the socket */ { printf("\r\n%d : Fail to create socket.",sockfd); } break; default: break; } }
void ftp_client_DTP(uint8 sock) { int len; int idx; switch( GetTCPSocketStatus(sock) ) { case STATUS_ESTABLISHED: if(bRunDTP) { bRunDTP = 0; #ifdef Debug printf("< FTP_DTP Connect OK>\r\n"); #endif } len = TCPRecv(sock, data_buf, TX_RX_MAX_BUF_SIZE); if( len > 0 ) { for( idx = 0; idx < len; idx++ ) { if( idx == 0 ) printf("\r\n"); printf("%c",data_buf[idx]); } } if( bRunPutFile ) { bRunPutFile = 0; TCPSend(sock, (void *)PUTFILE, strlen(PUTFILE)); TCPClose(sock); } break; case STATUS_CLOSE_WAIT: len = TCPRecv(sock, data_buf, TX_RX_MAX_BUF_SIZE); if( len > 0 ) { for( idx = 0; idx < len; idx++ ) { if( idx == 0 ) printf("\r\n"); printf("%c",data_buf[idx]); } } if( bRunPutFile ) { bRunPutFile = 0; TCPSend(sock, (void *)PUTFILE, strlen(PUTFILE)); } TCPClose(sock); break; case STATUS_CLOSED: TCPClose(sock); if( TCPServerOpen( sock, DTP_Port++ ) == 0 ) { printf("\r\nDTP Socket Open Error"); break; } if( DTP_Port > 70000 ) DTP_Port = FTP_Client_TCPS_Port; bRunDTP = 1; break; } }