lwip tcp編程

1.客戶端程序

{

  int iTCPClientSock = -1;
    struct sockaddr_in address;
    uint32_t u32InetAddr = 0;
    int iRecvLen = 0;
    OS_ERR eOSErr;
  LWIP_UNUSED_ARG(arg);

  /* Create a new connection identifier. */
  /* 創建TCP Socket */
    if((iTCPClientSock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
      PlatErrorPrint(0, "tcpecho_thread1 socket failed!");
    }

    /* 設置目的IP地址和端口號 */
    address.sin_family = AF_INET;
    address.sin_port = htons(TCP_SERVER_PORT);

    u32InetAddr = inet_addr(TCP_SERVER_IP);
    
    address.sin_addr.s_addr = u32InetAddr;
    memset(&address.sin_zero,0,sizeof(address.sin_zero));
    while(1)

    {

        //連接遠程的服務器

        if(connect(iTCPClientSock, (struct sockaddr *)&address, sizeof (address)) < 0) 
        {//如果連接失敗,則該socket就不能用了,網上說連接失敗後,socket的連接狀態不可知,如果連接狀態爲關閉狀態的話,就可以繼續connect,否則必須關閉連接,並重新申請socket。
            if((close(iTCPClientSock)) < 0)
            {//關閉socket
              PlatErrorPrint(0, "tcpecho_thread1 close failed!");
            }
            
            if((iTCPClientSock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
            {//申請新的socket
              PlatErrorPrint(0, "tcpecho_thread1 socket failed!");
            }
            PlatErrorPrint(0, "tcpecho_thread1 connect failed,err=%d!");
        }
        else
        {
            break;
        }
        OSTimeDly(1000, OS_OPT_TIME_TIMEOUT, &eOSErr);
    }
    PlatErrorPrint(0, "tcpecho_thread1 connect success!");

    while(1)
    {        
        while(1)
        {
//            iRecvLen = recv(iNewSocket,g_au8Send_1_Data,sizeof(g_au8Send_1_Data),0);
//            if(iRecvLen <= 0)
//            {//接收爲0時,是對方主動關閉了socket,《0時接收錯誤
//              PlatErrorPrint(0, "tcpecho_thread1 recv failed!");
//              break;
//            }

            iRecvLen = send(iTCPClientSock,g_au8Send_1_Data,sizeof(g_au8Send_1_Data),0);
            if(iRecvLen < 0)
            {//發送錯誤,比如對方關閉了端口,網線掉了......
              PlatErrorPrint(0, "tcpecho_thread1 send failed!");
              break;
            }
            OSTimeDly(5000, OS_OPT_TIME_TIMEOUT, &eOSErr);
        }
                
        if((close(iTCPClientSock)) < 0)
        {
          PlatErrorPrint(0, "tcpecho_thread1 close failed!");
        }
            
        
        if((iTCPClientSock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {
          PlatErrorPrint(0, "tcpecho_thread1 socket failed!");
        }
        
        /* 設置目的IP地址和端口號 */
        address.sin_family = AF_INET;
        address.sin_port = htons(TCP_SERVER_PORT);

        u32InetAddr = inet_addr(TCP_SERVER_IP);
        
        address.sin_addr.s_addr = u32InetAddr;
        while(1)
        {
            
            if(connect(iTCPClientSock, (struct sockaddr *)&address, sizeof(address)) < 0)
            {
                
                if((close(iTCPClientSock)) < 0)
                {
                  PlatErrorPrint(0, "tcpecho_thread1 close failed!");
                }

                if((iTCPClientSock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
                {
                  PlatErrorPrint(0, "tcpecho_thread1 socket failed!");
                }
                PlatErrorPrint(0, "tcpecho_thread1 connect failed,err=%d!");
            }
            else
            {
                break;
            }
            OSTimeDly(1000, OS_OPT_TIME_TIMEOUT, &eOSErr);
        }
        PlatErrorPrint(0, "tcpecho_thread1 connect success!");
        
    }

}

服務器端程序,以後再加。


發佈了44 篇原創文章 · 獲贊 23 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章