104 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			104 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /****************************************************************************
 | ||
|  | 
 | ||
|  | Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED. | ||
|  | 
 | ||
|  | This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT | ||
|  | be copied by any method or incorporated into another program without | ||
|  | the express written consent of Aerospace C.Power. This Information or any portion | ||
|  | thereof remains the property of Aerospace C.Power. The Information contained herein | ||
|  | is believed to be accurate and Aerospace C.Power assumes no responsibility or | ||
|  | liability for its use in any way and conveys no license or title under | ||
|  | any patent or copyright and makes no representation or warranty that this | ||
|  | Information is free from patent or copyright infringement. | ||
|  | 
 | ||
|  | ****************************************************************************/ | ||
|  | 
 | ||
|  | #include "lwip/sockets.h"
 | ||
|  | #include "iot_config.h"
 | ||
|  | 
 | ||
|  | #if (IOT_CLI_INF_MODE == IOT_CLI_INF_MODE_LWIP_SOCKET)
 | ||
|  | 
 | ||
|  | int cli_open_lwip_udp_socket(const char* bind_ip, uint32_t port) | ||
|  | { | ||
|  |     struct sockaddr_in bindaddr = {0}; | ||
|  |     bindaddr.sin_addr.s_addr = inet_addr(bind_ip); | ||
|  |     bindaddr.sin_family = AF_INET; | ||
|  |     bindaddr.sin_len = sizeof(bindaddr); | ||
|  |     bindaddr.sin_port = PP_HTONS((uint16_t)port); | ||
|  | 
 | ||
|  |     int socket = lwip_socket(AF_INET, SOCK_DGRAM, 0); | ||
|  |     lwip_bind(socket, (const struct sockaddr*)&bindaddr, sizeof(bindaddr)); | ||
|  |     return socket; | ||
|  | } | ||
|  | 
 | ||
|  | int cli_lwip_sendto(int s, const void *data, size_t size, | ||
|  |     const char* remote_ip, uint32_t port) | ||
|  | { | ||
|  |     struct sockaddr_in remoteaddr = { 0 }; | ||
|  |     remoteaddr.sin_addr.s_addr = inet_addr(remote_ip); | ||
|  |     remoteaddr.sin_family = AF_INET; | ||
|  |     remoteaddr.sin_len = sizeof(remoteaddr); | ||
|  |     remoteaddr.sin_port = PP_HTONS((uint16_t)port);; | ||
|  | 
 | ||
|  |     return lwip_sendto(s, data, size, 0, | ||
|  |         (const struct sockaddr*)&remoteaddr, sizeof(remoteaddr)); | ||
|  | } | ||
|  | 
 | ||
|  | int cli_lwip_recvfrom(int s, void *mem, size_t len, int flags, | ||
|  |     void *from, uint32_t addrlen) | ||
|  | { | ||
|  |     return lwip_recvfrom(s, mem, len, flags, (struct sockaddr*)from, | ||
|  |         (socklen_t*)&addrlen); | ||
|  | } | ||
|  | 
 | ||
|  | int cli_open_lwip_tcp_socket(uint32_t port) | ||
|  | { | ||
|  |     struct sockaddr_in bindaddr = { 0 }; | ||
|  | 
 | ||
|  |     bindaddr.sin_addr.s_addr = IPADDR_ANY; | ||
|  |     bindaddr.sin_family = AF_INET; | ||
|  |     bindaddr.sin_len = sizeof(bindaddr); | ||
|  |     bindaddr.sin_port = PP_HTONS((uint16_t)port); | ||
|  | 
 | ||
|  |     int skt = lwip_socket(AF_INET, SOCK_STREAM, 0); | ||
|  |     if (skt < 0) { | ||
|  |         return skt; | ||
|  |     } | ||
|  |     int ret = lwip_bind(skt, (const struct sockaddr*)&bindaddr, | ||
|  |         sizeof(bindaddr)); | ||
|  |     if (ret < 0) { | ||
|  |         return ret; | ||
|  |     } | ||
|  |     int opt = 1; | ||
|  |     setsockopt(skt, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(int)); | ||
|  |     setsockopt(skt, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(int)); | ||
|  |     ret = lwip_listen(skt, 1); // currently, only support 1 client
 | ||
|  |     if (ret < 0) { | ||
|  |         return ret; | ||
|  |     } | ||
|  |     return skt; | ||
|  | } | ||
|  | 
 | ||
|  | int cli_lwip_accept(int s) | ||
|  | { | ||
|  |     struct sockaddr_in remote; | ||
|  |     socklen_t len = sizeof(remote); | ||
|  |     int opt = 1; | ||
|  |     int new_s = lwip_accept(s, (struct sockaddr*)&remote, &len); | ||
|  |     setsockopt(new_s, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(int)); | ||
|  | 
 | ||
|  |     return new_s; | ||
|  | } | ||
|  | 
 | ||
|  | int cli_lwip_read(int s, void*men, size_t len) | ||
|  | { | ||
|  |     return lwip_read(s, men, len); | ||
|  | } | ||
|  | 
 | ||
|  | int cli_lwip_send(int s, void*buf, size_t len) | ||
|  | { | ||
|  |     return lwip_send(s, buf, len, 0); | ||
|  | } | ||
|  | 
 | ||
|  | #endif /*IOT_CLI_INF_MODE == IOT_CLI_INF_MODE_LWIP_SOCKET*/
 |