`int socketInit(char* targetIP, int targetPort, int type)
{
int socket_fd = 0;
in_addr_t ip = 0;
char test[100] = {0};
char test2[100] = {0};
int len = 0;
if ((socket_fd = socket(AF_INET, type, 0))<0) {
return -1;
}
if(SOCK_STREAM == type)
{
int opt = 1;
setsockopt(socket_fd, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(int));
//setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
int keepIdle = 10; // 30秒无数据后启动探测
int keepInterval = 1; // 每10秒发送一次探测包
int keepCount = 3; // 最多探测3次
setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepIdle, sizeof(keepIdle));
setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPINTVL, &keepInterval, sizeof(keepInterval));
setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPCNT, &keepCount, sizeof(keepCount));
}
memset(&targetSocket, 0, sizeof(targetSocket));
// inet_aton
targetSocket.sin_family = AF_INET;
targetSocket.sin_port = htons(targetPort);
if(NULL == targetIP)
{
ip = getActualIP();
}
else
{
ip = inet_addr(targetIP);
}
targetSocket.sin_addr.s_addr = ip;//inet_addr(targetIP);
ipPrint((uint8_t *)&ip,(uint8_t *)test2);
len = sprintf(test,"ip:%s,dk:%d\r\n",test2,targetPort);
debug_Print((unsigned char *)test,len);
return socket_fd;
}`
static void tcp_client_task(void* arg)
{
int ret = 0;
(void)arg;
while(1)
{
sockect_fd = socketInit((char *)sNwoIP, sNWoPort, SOCK_STREAM);
struct sockaddr_in local_addr;
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(sNWiPort); // 固定端口
local_addr.sin_addr.s_addr = INADDR_ANY; // 绑定到所有本地接口,可以设定其他ip
if (lwip_bind(sockect_fd, (struct sockaddr *)&local_addr, sizeof(local_addr)) < 0) { //设定本地端口
// 错误处理(例如端口被占用)
//lwip_close(sockect_fd);
goto __exit;
}
if (connect(sockect_fd, (struct sockaddr*)&targetSocket, sizeof(targetSocket)) == 0) {
ConnectionStatusSet(1);
}
else
{
goto __exit;
}
regisApp(1,1,NULL);
while (1) {
ret = read(sockect_fd, (char *)networkFIFO,recv_LEN);
if (ret>0) {
wNetEnterFifo(networkFIFO,ret);
}
else if(ret == -1)
{
debug_Print("bcl\r\n",5);
goto __exit;
}
}
__exit:
ConnectionStatusSet(0);
socketDeinit(sockect_fd);
vTaskDelay(relinkTime);
}
vTaskDelete(NULL);
}