TcpClientサンプルプログラムC言語


TCPクライアントサンプルプログラム
キーワード:
TCP      
TCP client   
LWIP TCP      
LWIP TCP client   

ネットワーク関連のコードをデバッグするたびに、最も簡単なTCPテストプログラムが必要になります.その後、このプログラムをコードクリップに記録しました.今日は自分のブログに再記録して、もっと検索しやすいことを望んでいます.
簡単なTCPクライアントプログラムソース
このコードは、RT-Tered OSでテストして使用し、検証に合格しました.
  • RT_が定義されている場合USING_SALマクロでは、RT-Thread SALコンポーネントが提供するsocketパッケージを使用して、SAL関連ヘッダファイル
  • を参照する必要があります.
    #include 
    #include 
    
  • RT_が定義されていない場合USING_SALマクロは、lwip socketを直接使用し、lwip関連ヘッダファイル
  • を含む.
    #include "lwip/sockets.h"
    #include "lwip/netdb.h"
    #include "lwip/sys.h"
    

    ソースコードは次のとおりです.
    #include 
    #include 
    #include 
    
    #ifdef RT_USING_SAL
    #include 
    #include 
    #else
    #include "lwip/sockets.h"
    #include "lwip/netdb.h"
    #include "lwip/sys.h"
    #endif
    
    #define SAL_TCP_TEST_HOST    "your host or ip addr"  /*      TCP server      ip    */
    #define SAL_TCP_TEST_PORT    (80u)                   /*      TCP Server     */
    #define SAL_TEST_BUFSZ       (1024u)
    
    static const char *send_tcp_req_data = "Hi, I am from tcp client.";
    
    static void _sal_tcp_test(void)
    {
        int ret, i;
        char *recv_data;
        struct hostent *host;
        int sock = -1, bytes_received;
        struct sockaddr_in server_addr;
    
        /*         url  host  (     ,      ) */
        host = gethostbyname(SAL_TCP_TEST_HOST);
        if (!host)
        {
            rt_kprintf("gethostbyname failed!\r
    "); return; } else { rt_kprintf("gethostbyname success!\r
    "); } recv_data = rt_calloc(1, SAL_TEST_BUFSZ); if (recv_data == RT_NULL) { rt_kprintf("No memory
    "); return; } /* socket, SOCKET_STREAM,TCP , TLS */ if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { rt_kprintf("Socket error
    "); goto __exit; } else { rt_kprintf("Socket pass
    "); } /* */ server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SAL_TCP_TEST_PORT); server_addr.sin_addr = *((struct in_addr *)host->h_addr); rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); rt_kprintf("will connect...
    "); if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0) { rt_kprintf("Connect fail!
    "); goto __exit; } else { rt_kprintf("Connect pass!
    "); } /* socket */ ret = send(sock, send_tcp_req_data, strlen(send_tcp_req_data), 0); if (ret <= 0) { rt_kprintf("send error,close the socket.
    "); goto __exit; } else { rt_kprintf("send pass!
    "); } /* , */ bytes_received = recv(sock, recv_data, SAL_TEST_BUFSZ - 1, 0); if (bytes_received <= 0) { rt_kprintf("received error,close the socket.
    "); goto __exit; } rt_kprintf("recv data:
    "); for (i = 0; i < bytes_received; i++) { rt_kprintf("%c", recv_data[i]); } __exit: if (recv_data) rt_free(recv_data); if (sock >= 0) closesocket(sock); } static void sal_tcp_test(void) { rt_thread_t tid; tid = rt_thread_create("sal_tcp", _sal_tcp_test, RT_NULL, 4096, 23, 5); if (tid) rt_thread_startup(tid); else { rt_kprintf("sal_tcp thread create failed!\r
    "); } } #ifdef FINSH_USING_MSH #include MSH_CMD_EXPORT(sal_tcp_test, SAL TCP function test); #endif /* FINSH_USING_MSH */

    RT-Thread MSHでは、Finshコマンドを直接使用して実行できます.
    msh /> sal_tcp_test