精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

有線網絡通信實驗3之TCP客戶端

汽車電子技術 ? 來源:滑小稽筆記 ? 作者:電子技術園地 ? 2023-03-01 14:27 ? 次閱讀

26.1 TCP協議概述

TCP是一種面向連接的,可靠地,基于IP的傳輸層協議,面向連接就意味著兩個實用TCP的應用在進行數據交換的時候必須先建立一個TCP連接,當應用層向TCP層發送用于傳輸的,用8位字節表示的數據流,TCP先把數據流分割成適當長度的報文段,最大傳輸段的長度MSS通常受計算機連接的網絡的數據鏈路層的最大傳輸單元MTU控制,之后TCP才把數據包傳給IP層,通過它來將數據傳送給接收端的TCP層。為了保證報文傳輸的可靠性,會給每個包一個序號,同時序號也保證了傳送到接收端的數據報文能被按照順序接收,然后接收端對成功接收的報文發回一個響應的確認ACK,如果傳送端在合理的時間RTT內沒有收到確認,那么對應的數據就會被重傳TCP在數據正確性和合法性上采用一個校驗和函數來測定數據是否有錯誤,在發送和接收時都必須計算校驗和,在保證可靠性上,對于窗口內未經確認的分組需要重傳報文,在擁塞控制上,采用TCP擁塞控制算法。

TCP數據被封裝在一個IP數據報文中,IP數據報文結構如下圖所示。

圖片

TCP報文數據格式在沒有選項的情況下,通常是20個字節,數據結構如下圖所示

圖片

(1)源端口號和目的端口號用于尋找發送端和接收端的應用進程,這個與UDP報文相同,這兩個值加上IP首部中的源IP地址和目的IP地址唯一確定了一個TCP連接。

(2)序列號字段用來標識從TCP發送端向TCP接收端發送的數據字節流,用于表示在這個報文段中的第一個數據字節,當建立一個新的連接時,握手報文中的SYN標志置1,這個握手報文中的序號字段為隨機選擇的初始序號ISN(Initial Sequence Number),當連接建立好以后發送方要發送的第一個字節序號為ISN+1。

(3)確認號字段只有在ACK為1的時候才有用,確認號中包含發送確認的一方所期望接收到的下一個序號,確認號是在上一次成功接收到的數據字節序列號上加1,例如上次接收成功接收到對方發過來的數據序號為X,那么返回的確認號就應該為X+1

(4)頭部長度又稱為首部長度,首部長度中給出了首部的長度,以4個字節為單位,這個字段有4bit,因此TCP最多有60字節的首部,如果沒有任何的選項字段,正常的首部長度是20字節,TCP首部中還有6個標志位,這6個標志位如下表所示。

標志位 說明
URG 置1時表示緊急指針有效
ACK 置1時表示確認序號字段有效
PSH 置1表示接收方應該盡快將這個報文段交給應用層
RST 置1表示重建連接
SYN 用于發起連接
FIN 發送端完成發送任務,終止連接

(5)窗口尺寸也就是窗口大小,其中填寫相應的值以通知對方期望接收的字節數,窗口大小字段是TCP流量控制的關鍵字段,窗口大小是一個2個字節的字段,因此窗口大小最大為65535個字節。

(6)16位校驗和和UDP的校驗和計算原理相同,這是一個強制性的字段,校驗和覆蓋整個TCP報文段。

(7)緊急指針只有在URG置1時有效,是一個正偏移量,和序號字段中的值相加表示緊急數據最后一個字節的序號。

tcp.c,tcp.h,tcp_in.c和tcp_out.c是LWIP中關于TCP協議的文件,TCP層中函數的關系如下圖所示。

圖片

常用的TCP協議的API函數如下表所示。

函數類型 API函數 功能
建立TCP連接 tcp_new() 創建一個TCP的PCB控制塊
tcp_bind() 為TCP的PCB控制塊綁定一個本地IP地址和端口號
tcp_listen() 開始TCP的PCB監聽
tcp_accept() 控制塊accept字段注冊的回調函數,偵聽到連接時被調用
tcp_accepted() 通知LWIP協議棧一個TCP連接被接受了
tcp_conect() 連接遠端主機
TCP數據發送 tcp_write() 構造一個報文并放在控制塊的發送隊列緩沖中
tcp_sent() 控制塊sent字段注冊的回調函數,數據發送成功后被回調
tcp_output() 將發送緩沖隊列中的數據發送出去
TCP數據接收 tcp_recv() 控制塊recv字段注冊的回調函數,當接收到新數據時被調用
tcp_recved() 當程序處理完數據后一定要調用這個函數,通知內核更新接收窗口
數據輪詢 tcp_poll() 控制塊poll字段注冊的回調函數,該函數周期性調用
關閉和終止連接 tcp_close() 關閉TCP連接
tcp_err() 控制塊err字段注冊的回調函數,遇到錯誤時被調用
tcp_abort() 中斷TCP連接

26.2 應用編寫

26.2.1 tcp_client.c代碼編寫

#include "tcp_client.h"
#include "delay.h"
#include "usart1.h"
#include "lcd.h"
#include "malloc.h"
#include "string.h"
#include "comm.h"
#include "lwip/debug.h"
#include "lwip/stats.h"
#include "lwip/memp.h"
#include "lwip/mem.h"
//TCP Client 測試全局狀態標記變量
//bit7:0,沒有數據要發送;1,有數據要發送
//bit6:0,沒有收到數據;1,收到數據了
//bit5:0,沒有連接上服務器;1,連接上服務器了
//bit4~0:保留
u8 tcp_client_flag;   
//設置遠端IP地址
void tcp_client_set_remoteip()
{
  u8 *tbuf;
  tbuf=mymalloc( SRAMIN, 100 ) ;                      //申請內存
  if( tbuf==NULL )
    return ;
  //前三個IP保持和DHCP得到的IP一致
  lwipdev.remoteip[ 0 ] = lwipdev.ip[ 0 ] ;
  lwipdev.remoteip[ 1 ] = lwipdev.ip[ 1 ] ;
  lwipdev.remoteip[ 2 ] = lwipdev.ip[ 2 ] ;
  lwipdev.remoteip[ 3 ] = 113 ;
  sprintf( ( char* )tbuf, "Remote IP:%d.%d.%d.", lwipdev.remoteip[0], lwipdev.remoteip[1], lwipdev.remoteip[2] ) ;
  LCD_ShowString( 30, 150, tbuf ) ;                    //遠端IP
  myfree( SRAMIN, tbuf ) ;
}
//關閉與服務器的連接
void tcp_client_connection_close( struct tcp_pcb *tpcb, struct tcp_client_struct *es )
{
  tcp_abort( tpcb ) ;                            //終止連接,刪除pcb控制塊
  tcp_arg( tpcb, NULL ) ;
  tcp_recv( tpcb, NULL ) ;
  tcp_sent( tpcb, NULL ) ;
  tcp_err( tpcb, NULL ) ;
  tcp_poll( tpcb, NULL, 0 );
  if( es )
    mem_free( es ) ;
  tcp_client_flag &= ~( 1<<5 ) ;                      //標記連接斷開了
}
// tcp_recv函數的回調函數
u8 tcp_client_recvbuf[ TCP_CLIENT_RX_BUFSIZE ] ;                //接收數據緩沖區
err_t tcp_client_recv( void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err )
{
  u32 data_len=0 ;
  struct pbuf *q ;
  struct tcp_client_struct *es ;
  err_t ret_err ;
  LWIP_ASSERT( "arg != NULL", arg!=NULL ) ;
  es = ( struct tcp_client_struct* )arg ;
  //如果從服務器接收到空的數據幀就關閉連接
  if( p==NULL )
  {
    es->state = ES_TCPCLIENT_CLOSING ;                //需要關閉TCP連接了
     es->p = p ;
    ret_err = ERR_OK ;
  }
  //當接收到一個非空的數據幀,但是err!=ERR_OK
  else if( err!=ERR_OK )
  { 
    if( p )
      pbuf_free( p ) ;                        //釋放接收pbuf
    ret_err = err ;
  }
  //當處于連接狀態時
  else if( es->state==ES_TCPCLIENT_CONNECTED )
  {
    //當處于連接狀態并且接收到的數據不為空時
    if( p!=NULL )
    {
      memset( tcp_client_recvbuf, 0, TCP_CLIENT_RX_BUFSIZE ) ;      //數據接收緩沖區清零
      //遍歷完整個pbuf鏈表
      for( q=p; q!=NULL; q=q->next )
      {
        if( q->len>( TCP_CLIENT_RX_BUFSIZE-data_len ) )
          memcpy( tcp_client_recvbuf+data_len, q->payload, TCP_CLIENT_RX_BUFSIZE-data_len ) ; 
        else
          memcpy( tcp_client_recvbuf+data_len, q->payload, q->len ) ;
        data_len += q->len ;
        //超出TCP客戶端接收數組,跳出
        if( data_len>TCP_CLIENT_RX_BUFSIZE )
          break ;
      }
      tcp_client_flag |= 1<<6 ;                    //標記接收到數據了
       tcp_recved( tpcb,p->tot_len );                  //用于獲取接收數據
      pbuf_free( p ) ;                        //釋放內存
      ret_err = ERR_OK ;
    }
  }
  //接收到數據但是連接已經關閉
  else
  { 
    tcp_recved( tpcb, p->tot_len ) ;                    //用于獲取接收數據
    es->p = NULL ;
    pbuf_free( p ) ;                          //釋放內存
    ret_err = ERR_OK ;
  }
  return ret_err ;
}
// tcp_err函數的回調函數
void tcp_client_error( void *arg, err_t err )
{


}
//發送數據
void tcp_client_senddata( struct tcp_pcb *tpcb, struct tcp_client_struct *es )
{
  struct pbuf *ptr ; 
   err_t wr_err = ERR_OK ;
  while( ( wr_err==ERR_OK )&&( es->p )&&( es->p->len<=tcp_sndbuf( tpcb ) ) )
  {
    ptr = es->p ;
    wr_err = tcp_write( tpcb, ptr->payload, ptr->len, 1 ) ;          //數據加入到發送緩沖隊列中
    if( wr_err==ERR_OK )
    {
      es->p = ptr->next ;                      //指向下一個pbuf
      //pbuf的ref加一
      if( es->p )
        pbuf_ref( es->p );
      pbuf_free( ptr ) ;                        //釋放ptr
    }
    else if( wr_err==ERR_MEM )
      es->p = ptr ;
    tcp_output( tpcb ) ;                        //發送緩沖隊列中的數據發送
  }
}
// tcp_sent的回調函數(從遠端接收到ACK后發送數據)
err_t tcp_client_sent( void *arg, struct tcp_pcb *tpcb, u16_t len )
{
  struct tcp_client_struct *es ;
  LWIP_UNUSED_ARG( len ) ;
  es = ( struct tcp_client_struct* )arg ;
  if( es->p )
    tcp_client_senddata( tpcb, es ) ;                    //發送數據
  return ERR_OK ;
}
// tcp_poll的回調函數
const u8 *tcp_client_sendbuf = "STM32F103 TCP Client send data\\r\\n" ;      //TCP服務器發送數據內容
err_t tcp_client_poll( void *arg, struct tcp_pcb *tpcb )
{
  err_t ret_err ;
  struct tcp_client_struct *es ; 
  es = ( struct tcp_client_struct* )arg ;
  //連接處于空閑可以發送數據
  if( es!=NULL )
  {
    //判斷是否有數據要發送
    if( tcp_client_flag&( 1<<7 ) )
    {
      es->p = pbuf_alloc( PBUF_TRANSPORT, strlen( ( char* )tcp_client_sendbuf ), PBUF_POOL ) ; 
      pbuf_take( es->p, ( char* )tcp_client_sendbuf, strlen( ( char* )tcp_client_sendbuf ) ) ; 
      tcp_client_senddata( tpcb, es ) ;                  //將數據發送出去
      tcp_client_flag &= ~( 1<<7 ) ;                  //清除數據發送標志
      //釋放內存
      if( es->p )
        pbuf_free( es->p ) ;
    }
    else if( es->state==ES_TCPCLIENT_CLOSING )
       tcp_client_connection_close( tpcb, es ) ;              //關閉TCP連接
    ret_err = ERR_OK ;
  }
  else
  { 
    tcp_abort( tpcb ) ;                          //終止連接,刪除pcb控制塊
    ret_err = ERR_ABRT ;
  }
  return ret_err ;
}
//連接建立后調用回調函數
err_t tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
{
  struct tcp_client_struct *es=NULL;  
  if(err==ERR_OK)   
  {
    es = ( struct tcp_client_struct* )mem_malloc( sizeof( struct tcp_client_struct ) ) ; //申請內存
    //內存申請成功
    if( es )
    {
       es->state = ES_TCPCLIENT_CONNECTED ;            //狀態為連接成功
      es->pcb = tpcb ;
      es->p = NULL ;
      tcp_arg( tpcb, es ) ;                      //更新tpcb的callback_arg
      tcp_recv( tpcb, tcp_client_recv ) ;                  //初始化tcp_recv回調功能
      tcp_err( tpcb, tcp_client_error ) ;                  //初始化tcp_err()回調函數
      tcp_sent( tpcb, tcp_client_sent ) ;                  //初始化tcp_sent回調功能
      tcp_poll( tpcb, tcp_client_poll, 1 ) ;                //初始化tcp_poll回調功能
       tcp_client_flag |= 1<<5 ;                    //標記連接到服務器了
      err = ERR_OK ;
    }
    else
    {
      tcp_client_connection_close( tpcb, es ) ;              //關閉連接
      err = ERR_MEM ;                        //返回內存分配錯誤
    }
  }
  else
    tcp_client_connection_close( tpcb, 0 ) ;                //關閉連接
  return err ;
}
//客戶機測試
void tcp_client_test()
{
   struct tcp_pcb *tcppcb ;                        //定義一個TCP服務器控制塊
  struct ip_addr rmtipaddr ;                        //遠端ip地址
  u8 *tbuf ;
  u8 res=0 ;    
  u8 t=0 ; 
  u8 connflag=0 ;                            //連接標記
  tcp_client_set_remoteip() ;                        //先選擇IP
  tbuf = mymalloc( SRAMIN, 200 ) ;                    //申請內存
  //內存申請失敗了,直接退出
  if( tbuf==NULL )
    return ;
  sprintf( ( char* )tbuf, "Local IP:%d.%d.%d.%d", lwipdev.ip[0], lwipdev.ip[1], lwipdev.ip[2], lwipdev.ip[3] ) ;
  LCD_ShowString( 30, 130, tbuf ) ;                    //服務器IP
  sprintf( ( char* )tbuf, "Remote IP:%d.%d.%d.%d", lwipdev.remoteip[0], lwipdev.remoteip[1], lwipdev.remoteip[2], lwipdev.remoteip[3] ) ;
  LCD_ShowString( 30, 150, tbuf ) ;                    //遠端IP
  sprintf( ( char* )tbuf, "Remote Port:%d", TCP_CLIENT_PORT ) ;          //客戶端端口號
  LCD_ShowString( 30, 170, tbuf ) ;
  LCD_ShowString( 30, 190, "STATUS:Disconnected" ) ;
  tcppcb = tcp_new() ;                          //創建一個新的pcb
  //創建成功
  if( tcppcb )
  {
  IP4_ADDR( &rmtipaddr, lwipdev.remoteip[0], lwipdev.remoteip[1], lwipdev.remoteip[2], lwipdev.remoteip[3] ) ;
    tcp_connect( tcppcb, &rmtipaddr, TCP_CLIENT_PORT, tcp_client_connected ) ; 
   }
  else
    res = 1 ;
  while( res==0 )
  {
    //是否收到數據
    if( tcp_client_flag&1<<6 )
    {
      LCD_ShowString( 30, 230, tcp_client_recvbuf ) ;            //顯示接收到的數據
      tcp_client_flag |= 1<<7 ;                    //標記要發送數據
      tcp_client_flag &= ~( 1<<6 ) ;                  //標記數據已經被處理了
    }
    //是否連接上
    if( tcp_client_flag&1<<5 )
    {
      if( connflag==0 )
      { 
        LCD_ShowString( 30, 190, "STATUS:Connected   " ) ;
        LCD_ShowString( 30, 210, "Receive Data:" ) ;
        connflag = 1 ;                        //標記連接了
      }
    }
    else if( connflag )
    {
       LCD_ShowString( 30, 190, "STATUS:Disconnected" ) ;
      connflag = 0 ;                          //標記連接斷開了
    } 
    lwip_periodic_handle() ;
    lwip_pkt_handle() ;
    delay_ms( 2 ) ;
    t ++ ;
    if( t==200 )
    {
      //未連接上,則嘗試重連
      if( ( connflag==0 )&&( ( tcp_client_flag&1<<5 )==0 ) )
      { 
        tcp_client_connection_close( tcppcb, 0 ) ;            //關閉連接
        tcppcb = tcp_new() ;                    //創建一個新的pcb
        //創建成功
        if( tcppcb )
          tcp_connect( tcppcb, &rmtipaddr, TCP_CLIENT_PORT, tcp_client_connected ) ; 
      }
      t = 0 ;
    }    
  }
  tcp_client_connection_close( tcppcb, 0 ) ;                  //關閉TCP Client連接
  myfree( SRAMIN, tbuf ) ;
}

26.2.2 tcp_client.h代碼編寫

#ifndef _TCP_CLIENT_H_
#define _TCP_CLIENT_H_
#include "sys.h"
#include "lwip/tcp.h"
#include "lwip/pbuf.h"
#define TCP_CLIENT_RX_BUFSIZE  1500            //最大接收數據長度
#define TCP_CLIENT_TX_BUFSIZE  200              //最大發送數據長度
#define LWIP_SEND_DATA      0x80            //有數據發送
#define  TCP_CLIENT_PORT    8087            //遠端端口
//tcp服務器連接狀態
enum tcp_client_states
{
  ES_TCPCLIENT_NONE = 0,    //沒有連接
  ES_TCPCLIENT_CONNECTED,  //連接到服務器了 
  ES_TCPCLIENT_CLOSING,    //關閉連接
};
//LWIP回調函數使用的結構體
struct tcp_client_struct
{
  u8 state;            //當前連接狀
  struct tcp_pcb *pcb;      //指向當前的pcb
  struct pbuf *p;        //指向接收/或傳輸的pbuf
};  
void tcp_client_test( void ) ;                    //TCP Client測試函數
#endif

26.2.3 主函數代碼編寫

#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "tim.h"
#include "lcd.h"
#include "malloc.h"
#include "dm9000.h"
#include "lwip/netif.h"
#include "comm.h"
#include "lwipopts.h"
#include "tcp_client.h"
int main()
{
  u8 buf[ 30 ];
   STM32_Clock_Init( 9 ) ;                        //系統時鐘設置
  SysTick_Init( 72 ) ;                          //延時初始化
  USART1_Init( 72, 115200 ) ;                      //串口初始化為115200
  LCD_Init() ;                            //初始化LCD
  TIM3_Init( 1000, 719 ) ;                        //定時器3頻率為100hz
  my_mem_init( SRAMIN ) ;                      //初始化內部內存池
  while( lwip_comm_init() ) ;                      //lwip初始化
  //等待DHCP獲取成功/超時溢出
  while( ( lwipdev.dhcpstatus!=2 )&&( lwipdev.dhcpstatus!=0xFF ) )
  {
    lwip_periodic_handle() ;                    //LWIP內核需要定時處理的函數
    lwip_pkt_handle() ;
  }
  POINT_COLOR=RED;
  LCD_ShowString( 30, 110, "LWIP Init Successed" ) ;
  //打印動態IP地址
  if( lwipdev.dhcpstatus==2 )
    sprintf( ( char* )buf, "DHCP IP:%d.%d.%d.%d", lwipdev.ip[0], lwipdev.ip[1], lwipdev.ip[2], lwipdev.ip[3] ) ;
  //打印靜態IP地址
  else
    sprintf( ( char* )buf, "Static IP:%d.%d.%d.%d", lwipdev.ip[0], lwipdev.ip[1], lwipdev.ip[2], lwipdev.ip[3] ) ;
  LCD_ShowString( 30, 130, buf ) ; 
  //得到網速
  if( ( DM9000_Get_SpeedAndDuplex()&0x02 )==0x02 )
    LCD_ShowString( 30, 150, "Ethernet Speed:10M" ) ;
  else
    LCD_ShowString( 30, 150, "Ethernet Speed:100M" ) ;
   while( 1 )
  {
    tcp_client_test() ;
    lwip_periodic_handle() ;
    lwip_pkt_handle() ;
    delay_ms( 2 ) ;
  }
}

26.3 實驗結果

圖片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1350

    瀏覽量

    78986
  • MSS
    MSS
    +關注

    關注

    0

    文章

    5

    瀏覽量

    6718
  • 傳輸層協議
    +關注

    關注

    0

    文章

    6

    瀏覽量

    1255
收藏 人收藏

    評論

    相關推薦

    LABVIEW實現網絡通信的方法

    網絡通信,可以使用的通信協議類型包括TCP/IP協議、UDP、串口通信協議、無線網絡協議等;(2)使用基于
    發表于 12-12 18:02

    四種在LabVIEW中實現網絡通信的方法

    方便的實現數據的共享。用戶無需了解任何的底層復雜的網絡通信,就能輕松地實現數據交換。用戶建立和使用共享變量就如同操作全局變量一樣方便?! ?.2 利用共享變量通信實例  以下通過C/S(客戶端/服務器
    發表于 02-04 15:32

    labview TCP客戶端

    最近在做一個labview 客戶端測試小程序,服務器采用MFC編寫,客戶端采用TCP偵聽函數,通信可以連接,數據也正確,但是服務器檢測發送
    發表于 06-30 23:15

    【NanoPi NEO試用體驗】TCP通信客戶端程序

    寫了一個TCP通信客戶端程序,匆忙之間寫的,不夠完善,可以圍觀,給出精辟的見解。百度百科TCP/IP介紹:http://baike.baidu.com/link?url
    發表于 12-28 23:40

    android的Tcp網絡通信

    在所有的通信中,網絡通信是用到的比較多的一種,這一節我們主要是在廣州微嵌安卓工業平板上學習是如何進行Tcp通信的。Tcp
    發表于 12-05 10:49

    基于LABVIEW實現網絡通信的方法

    任何的底層復雜的網絡通信,就能輕松地實現數據交換。用戶建立和使用共享變量就如同操作全局變量一樣方便。4.2 利用共享變量通信實例  以下通過C/S(客戶端/服務器)通信模式實現數據的傳
    發表于 04-28 10:04

    請問在做網絡通信試驗時,PC一般是客戶端還是服務器?

    原子哥以及論壇里面的各位大神,請問在做網絡通信試驗時,PC一般是客戶端還是服務器?單片機這邊應該是客戶端還是服務器?
    發表于 06-27 02:12

    為什么網絡通信實驗TCP客戶端模式時連接不上?

    戰艦V3上的實驗50 網絡通信實驗,當用TCP服務器模式時,通信正常,用TCP
    發表于 08-16 04:35

    為什么網絡通信實驗網絡助手上接受到的先是456個字節?

    網絡通信實驗里將ARMF407配置成sever,通過電腦上網絡助手接受ARM發送到數據,將tcp_sever_sendbuf[1000]改成一個1000的大數組并賦值,但是在網絡助手
    發表于 09-02 02:54

    STM32F103上網絡通信實驗中服務器與客戶端連接但不能進行數據交換該怎么辦?

    我在應用原子哥的103板子的網絡通信實驗時,發現了一個小問題,就是在服務器模式下,板子可以與很多的客戶端建立連接,但是在進行數據交換時,卻只能和第一個連上的客戶端進行數據交換,只有在于這個客戶
    發表于 10-15 04:37

    基于原子STM32F4的攝像頭與網絡通信實驗

    網絡通信C/S方式將STM32攝像頭拍取的照片傳輸到電腦在PC開發可視化界面接受攝像頭數據并更新顯示2.實施步驟:1.參考STM32原子攝像頭實驗
    發表于 08-03 06:04

    stm32f107vc lwip tcp客戶端

    模擬的服務器,實現簡單的數據收發,通過上位機控制板子的LED燈一 打開工程《科星F107開發板網絡應用篇TCP客戶端》打開M
    發表于 08-06 09:17

    基于TCP/IP的網絡通信應用程序分享

    基于TCP/IP的網絡通信應用程序(TCP-Server)上一篇文章講述了在i.MX6UL開發板中,以客戶端的角色,使用TCP/IP協議進行
    發表于 12-23 08:12

    網絡調試和串口調試集合UDP TCP客戶端TCP服務器應用程序免費下載

    本文檔的主要內容詳細介紹的是網絡調試和串口調試集合UDP TCP客戶端TCP服務器應用程序免費下載。
    發表于 08-30 08:00 ?16次下載
    <b class='flag-5'>網絡</b>調試和串口調試集合UDP <b class='flag-5'>TCP</b><b class='flag-5'>客戶端</b>和<b class='flag-5'>TCP</b>服務器<b class='flag-5'>端</b>應用程序免費下載

    網絡通信的特點

    網絡通信可以分為兩大類:客戶端客戶端(C/S)和Peer-To-Peer(P2P)網絡通信。其中,客戶端/服務器式
    發表于 05-08 15:12 ?2277次閱讀