4.3 TCP客戶端通訊
本節我們使用開發板建立一個 tcp 客戶端,再去連線指定地址和埠的 tcp 服務端並進行資料通訊。開啟巨集定義 DEMO_SOCKET_CLIENT_SERVER、DEMO_CONNECT_NET;
在開發板連網成功後,建立TCP連線。
int demo_socket_client(char *ssid, char *pwd,int port,char *ip)
{
struct tls_ethif * ethif;
c_connect_wifi(ssid,pwd);
while(1)
{
tls_os_time_delay(1);
ethif = tls_netif_get_ethif();
if(ethif->status)
break;
}
socket_client_connect(port,ip);
return 0;
}
建立一個socket連線,連線指定目標的TCP伺服器。
static int socket_client_connect(int port, char *ip)
{
int ret;
char sock_rx[DEMO_SOCK_BUF_SIZE] = {0};
struct sockaddr_in pin;
printf("port:%d,ip:%s\n",port,ip);
while(1)
{
memset(&pin, 0, sizeof(struct sockaddr));
pin.sin_family=AF_INET;
pin.sin_addr.s_addr = ipaddr_addr(ip); pin.sin_port=htons(port); if((socket_num = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) { printf("creat socket fail, errno:%d\n",errno); return -1; } if (connect(socket_num, (struct sockaddr *)&pin, sizeof(struct sockaddr)) != 0) { printf("connect fail errno:%d\n",errno); } else { printf("connect success\n"); } while(1) { tls_os_time_delay(1000); ret = send(socket_num, sock_tx, strlen(sock_tx), 0); if(ret < 0) { printf("Error occured during sending, errno:%d\n",errno); break; } ret = recv(socket_num, sock_rx, sizeof(sock_rx)-1, 0); if(ret < 0) { printf("Receive failed, errno:%d\n",errno); break; } else { sock_rx[ret] = 0; printf("\nReceive %d bytes from %s\n",ret,ip); printf("%s\n",sock_rx); } tls_os_time_delay(2); } if(socket_num != -1) { printf("shutting down socket and restaring...\n"); shutdown(socket_num,0); closesocket(socket_num); socket_num = -1; } }
}
程式編譯並下載到開發板,在 PC 上建立一個 tcp server,設定監聽埠為 8080,IP地址為電腦本機的IP。
通過串列埠指令指定wifi的名稱和密碼,指定TCP伺服器的IP地址和埠號。如:t-client("@snail","ss559550",8080,"192.168.2.103")
連線成功,網路除錯助手會收到訊息。