0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

有線網(wǎng)絡(luò)通信實(shí)驗(yàn)4之TCP服務(wù)器

汽車(chē)電子技術(shù) ? 來(lái)源:滑小稽筆記 ? 作者:電子技術(shù)園地 ? 2023-03-01 14:26 ? 次閱讀

有關(guān)于TCP協(xié)議的知識(shí)在上一章已經(jīng)有過(guò)描述,這里我們直接使用API來(lái)實(shí)現(xiàn)TCP服務(wù)器模式。

27.1 實(shí)驗(yàn)例程

27.1.1 tcp_server.c代碼編寫(xiě)

#include "tcp_server.h"
#include "delay.h"
#include "usart1.h"
#include "lcd.h"
#include "malloc.h"
#include "string.h"
#include "lwip/debug.h"
#include "lwip/stats.h"
#include "lwip/memp.h"
#include "lwip/mem.h"
#include "comm.h"
//TCP Server 測(cè)試全局狀態(tài)標(biāo)記變量
//bit7:0,沒(méi)有數(shù)據(jù)要發(fā)送;1,有數(shù)據(jù)要發(fā)送
//bit6:0,沒(méi)有收到數(shù)據(jù);1,收到數(shù)據(jù)了.
//bit5:0,沒(méi)有客戶端連接上;1,有客戶端連接上了.
//bit4~0:保留
u8 tcp_server_flag;
//關(guān)閉tcp連接
void tcp_server_connection_close( struct tcp_pcb *tpcb, struct tcp_server_struct *es )
{
  tcp_close( tpcb ) ;
  tcp_arg( tpcb, NULL ) ;
  tcp_sent( tpcb, NULL ) ;
  tcp_recv( tpcb, NULL ) ;
  tcp_err( tpcb, NULL ) ;
  tcp_poll( tpcb, NULL, 0 ) ;
  if( es )
    mem_free( es ) ; 
  tcp_server_flag &= ~( 1<<5 ) ;                      //標(biāo)記連接斷開(kāi)了
}
// tcp_recv函數(shù)的回調(diào)函數(shù)
u8 tcp_server_recvbuf[ TCP_SERVER_RX_BUFSIZE ] ;                //TCP Server接收數(shù)據(jù)緩沖區(qū)
err_t tcp_server_recv( void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err )
{
  err_t ret_err ;
  u32 data_len = 0 ;
  struct pbuf *q ;
    struct tcp_server_struct *es ;
  LWIP_ASSERT( "arg != NULL", arg != NULL ) ;
  es = ( struct tcp_server_struct* )arg ;
  //從客戶端接收到空數(shù)據(jù)
  if( p==NULL )
  {
    es->state = ES_TCPSERVER_CLOSING ;                //需要關(guān)閉TCP連接了
    es->p = p ; 
    ret_err = ERR_OK ;
  }
  //從客戶端接收到一個(gè)非空數(shù)據(jù),但是由于某種原因err!=ERR_OK
  else if( err!=ERR_OK )
  {
    if( p )
      pbuf_free( p ) ;                        //釋放接收pbuf
    ret_err = err ;
  }
  //處于連接狀態(tài)
  else if( es->state==ES_TCPSERVER_ACCEPTED )
  {
    //當(dāng)處于連接狀態(tài)并且接收到的數(shù)據(jù)不為空時(shí)將其打印出來(lái)
    if( p!=NULL )
    {
      memset( tcp_server_recvbuf, 0, TCP_SERVER_RX_BUFSIZE ) ;      //數(shù)據(jù)接收緩沖區(qū)清零
      //遍歷完整個(gè)pbuf鏈表
      for( q=p; q!=NULL; q=q->next )
      {
        if( q->len>( TCP_SERVER_RX_BUFSIZE-data_len ) )
          memcpy( tcp_server_recvbuf+data_len, q->payload, TCP_SERVER_RX_BUFSIZE-data_len ) ; 
        else
          memcpy(tcp_server_recvbuf+data_len, q->payload, q->len ) ;
        data_len += q->len ;
        //超出TCP客戶端接收數(shù)組,跳出
        if( data_len>TCP_SERVER_RX_BUFSIZE )
          break ;
      }
      tcp_server_flag |= 1<<6 ;                    //標(biāo)記接收到數(shù)據(jù)了
      lwipdev.remoteip[ 0 ] = tpcb->remote_ip.addr&0xFF ;        //IADDR4
      lwipdev.remoteip[ 1 ] = ( tpcb->remote_ip.addr>>8 )&0xFF ;    //IADDR3
      lwipdev.remoteip[ 2 ] = ( tpcb->remote_ip.addr>>16 )&0xFF ;    //IADDR2
      lwipdev.remoteip[ 3 ] = ( tpcb->remote_ip.addr>>24 )&0xFF ;    //IADDR1 
       tcp_recved( tpcb, p->tot_len ) ;                  //用于獲取接收數(shù)據(jù)
      pbuf_free( p ) ;                        //釋放內(nèi)存
      ret_err = ERR_OK ;
    }
  }
  //服務(wù)器關(guān)閉了
  else
  {
    tcp_recved( tpcb, p->tot_len  );                    //用于獲取接收數(shù)據(jù)
    es->p=  NULL ;
    pbuf_free( p ) ;                          //釋放內(nèi)存
    ret_err = ERR_OK ;
  }
  return ret_err ;
}
// tcp_err函數(shù)的回調(diào)函數(shù)
void tcp_server_error( void *arg, err_t err )
{  
  LWIP_UNUSED_ARG( err ) ;
  printf( "tcp error:%x\\r\\n", ( u32 )arg ) ;
  //釋放內(nèi)存
  if( arg!=NULL )
    mem_free( arg ) ;
}
//發(fā)送數(shù)據(jù)
void tcp_server_senddata( struct tcp_pcb *tpcb, struct tcp_server_struct *es )
{
  struct pbuf *ptr ;
  u16 plen ;
  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 )
    { 
      plen = ptr->len ;
      es->p = ptr->next ;                      //指向下一個(gè)pbuf
      //pbuf的ref加一
      if( es->p )
        pbuf_ref( es->p ) ;
      pbuf_free( ptr ) ;
      tcp_recved( tpcb, plen ) ;                    //更新tcp窗口大小
    }
    else if( wr_err==ERR_MEM )
      es->p = ptr ;
   }
}
// tcp_poll的回調(diào)函數(shù)
const u8 *tcp_server_sendbuf = "STM32F103 TCP Server send data\\r\\n" ;      //TCP服務(wù)器發(fā)送數(shù)據(jù)內(nèi)容
err_t tcp_server_poll( void *arg, struct tcp_pcb *tpcb )
{
  err_t ret_err;
  struct tcp_server_struct *es ; 
  es = ( struct tcp_server_struct* )arg ;
  if( es!=NULL )
  {
    //判斷是否有數(shù)據(jù)要發(fā)送
    if( tcp_server_flag&( 1<<7 ) )
    {
      es->p = pbuf_alloc( PBUF_TRANSPORT, strlen( ( char* )tcp_server_sendbuf ), PBUF_POOL ) ; 
      pbuf_take( es->p, ( char* )tcp_server_sendbuf, strlen( ( char* )tcp_server_sendbuf ) ) ;
      tcp_server_senddata( tpcb, es ) ;                  //輪詢的時(shí)候發(fā)送要發(fā)送的數(shù)據(jù)
      tcp_server_flag &= ~( 1<<7 ) ;                  //清除數(shù)據(jù)發(fā)送標(biāo)志位
      if( es->p!=NULL )
        pbuf_free( es->p ) ;                    //釋放內(nèi)存  
    }
    //關(guān)閉操作
    else if( es->state==ES_TCPSERVER_CLOSING )
      tcp_server_connection_close( tpcb, es ) ;              //關(guān)閉連接
    ret_err = ERR_OK ;
  }
  else
  {
    tcp_abort( tpcb ) ;                          //終止連接,刪除pcb控制塊
    ret_err = ERR_ABRT ; 
  }
  return ret_err ;
}
// tcp_sent的回調(diào)函數(shù)(遠(yuǎn)端收到ACK信號(hào)后發(fā)送數(shù)據(jù))
err_t tcp_server_sent( void *arg, struct tcp_pcb *tpcb, u16_t len )
{
  struct tcp_server_struct *es ;
  LWIP_UNUSED_ARG( len ) ;
  es = ( struct tcp_server_struct * )arg ;
  if( es->p )
    tcp_server_senddata( tpcb, es ) ;                    //發(fā)送數(shù)據(jù)
  return ERR_OK ;
}
//強(qiáng)制刪除主動(dòng)斷開(kāi)時(shí)的time wait
extern void tcp_pcb_purge( struct tcp_pcb *pcb ) ;                //在 tcp.c里面
extern struct tcp_pcb *tcp_active_pcbs ;                    //在 tcp.c里面
extern struct tcp_pcb *tcp_tw_pcbs ;                      //在 tcp.c里面
void tcp_server_remove_timewait()
{
  struct tcp_pcb *pcb, *pcb2 ; 
  while( tcp_active_pcbs!=NULL )
  {
    lwip_periodic_handle() ;                      //繼續(xù)輪詢
    lwip_pkt_handle() ;
     delay_ms( 10 ) ;                          //等待tcp_active_pcbs為空  
  }
  pcb = tcp_tw_pcbs ;
  //如果有等待狀態(tài)的pcbs
  while( pcb!=NULL )
  {
    tcp_pcb_purge( pcb ) ;
    tcp_tw_pcbs = pcb->next ;
    pcb2 = pcb ;
    pcb = pcb->next ;
    memp_free( MEMP_TCP_PCB, pcb2 ) ;
  }
}
// tcp_accept的回調(diào)函數(shù)
err_t tcp_server_accept( void *arg, struct tcp_pcb *newpcb, err_t err )
{
  err_t ret_err ;
  struct tcp_server_struct *es ;
   LWIP_UNUSED_ARG( arg ) ;
  LWIP_UNUSED_ARG( err ) ;
  tcp_setprio( newpcb, TCP_PRIO_MIN ) ;                                //設(shè)置新創(chuàng)建的pcb優(yōu)先級(jí)
  es = ( struct tcp_server_struct* )mem_malloc( sizeof( struct tcp_server_struct ) ) ;  //分配內(nèi)存
  //內(nèi)存分配成功
   if( es!=NULL )
  {
    es->state = ES_TCPSERVER_ACCEPTED ;                //接收連接
    es->pcb = newpcb ;
    es->p = NULL ;
    tcp_arg( newpcb, es ) ;
    tcp_recv( newpcb, tcp_server_recv ) ;                  //初始化tcp_recv的回調(diào)函數(shù)
    tcp_err( newpcb, tcp_server_error ) ;                  //初始化tcp_err回調(diào)函數(shù)
    tcp_poll( newpcb, tcp_server_poll, 1 ) ;                //初始化tcp_poll回調(diào)函數(shù)
    tcp_sent( newpcb, tcp_server_sent ) ;                  //初始化發(fā)送回調(diào)函數(shù)
    tcp_server_flag |= 1<<5 ;                      //標(biāo)記有客戶端連上了
    lwipdev.remoteip[ 0 ] = newpcb->remote_ip.addr&0xFF ;        //IADDR4
    lwipdev.remoteip[ 1 ] = ( newpcb->remote_ip.addr>>8 )&0xFF ;      //IADDR3
    lwipdev.remoteip[ 2 ] = ( newpcb->remote_ip.addr>>16 )&0xFF ;      //IADDR2
    lwipdev.remoteip[ 3 ] = ( newpcb->remote_ip.addr>>24 )&0xFF ;      //IADDR1
    ret_err = ERR_OK ;
  }
  else
    ret_err = ERR_MEM ;
  return ret_err ;
}
// TCP Server 測(cè)試
void tcp_server_test()
{
  err_t err ;  
  struct tcp_pcb *tcppcbnew ;                        //定義一個(gè)TCP服務(wù)器控制塊
  struct tcp_pcb *tcppcbconn ;                      //定義一個(gè)TCP服務(wù)器控制塊
  u8 *tbuf ;
  u8 res=0 ;
  u8 connflag=0 ;                            //連接標(biāo)記
  tbuf = mymalloc( SRAMIN, 200 ) ;                    //申請(qǐng)內(nèi)存
  //內(nèi)存申請(qǐng)失敗了,直接退出
  if( tbuf==NULL )
    return ;
  sprintf( ( char* )tbuf, "Server IP:%d.%d.%d.%d", lwipdev.ip[0], lwipdev.ip[1], lwipdev.ip[2], lwipdev.ip[3] ) ;
  LCD_ShowString( 30, 130, tbuf ) ;                    //服務(wù)器IP
  sprintf( ( char* )tbuf, "Server Port:%d", TCP_SERVER_PORT ) ;
  LCD_ShowString( 30, 150, tbuf ) ;                    //服務(wù)器端口號(hào)
  tcppcbnew = tcp_new() ;                        //創(chuàng)建一個(gè)新的pcb
  //創(chuàng)建成功
  if( tcppcbnew )
  {
    err = tcp_bind( tcppcbnew, IP_ADDR_ANY, TCP_SERVER_PORT ) ;      //將本地IP與指定端口號(hào)綁定
    //綁定完成
    if( err==ERR_OK )
    {
      tcppcbconn = tcp_listen( tcppcbnew ) ;              //設(shè)置tcppcb進(jìn)入監(jiān)聽(tīng)狀態(tài)
      tcp_accept( tcppcbconn, tcp_server_accept ) ;            //初始化tcp_accept的回調(diào)函數(shù)
    }
    else
      res = 1 ;
  }
  else
    res = 1 ;
  while( res==0 )
  {
    //收到數(shù)據(jù)
    if( tcp_server_flag&1<<6 )
    {
      tcp_server_flag |= 1<<7 ;                    //標(biāo)記要發(fā)送數(shù)據(jù)
      LCD_ShowString( 30, 210, tcp_server_recvbuf ) ;          //顯示接收到的數(shù)據(jù)
      tcp_server_flag &= ~( 1<<6 ) ;                  //標(biāo)記數(shù)據(jù)已經(jīng)被處理了
    }
    //是否連接上
    if( tcp_server_flag&1<<5 )
    {
      if( connflag==0 )
      { 
      sprintf( ( char* )tbuf, "Client IP:%d.%d.%d.%d", lwipdev.remoteip[0], lwipdev.remoteip[1], lwipdev.remoteip[2], lwipdev.remoteip[3] ) ;
         LCD_ShowString( 30, 170, tbuf ) ;              //客戶端IP
        LCD_ShowString( 30, 190, "Receive Data:" ) ;          //提示消息
        connflag = 1 ;                        //標(biāo)記連接了
      }
    }
    else if( connflag )
      connflag = 0 ;                          //標(biāo)記連接斷開(kāi)了
    lwip_periodic_handle() ;
    lwip_pkt_handle() ;
    delay_ms( 2 ) ;
  }   
  tcp_server_connection_close( tcppcbnew, 0 ) ;                //關(guān)閉TCP Server連接
  tcp_server_connection_close( tcppcbconn, 0 ) ;                //關(guān)閉TCP Server連接
  tcp_server_remove_timewait() ; 
  memset( tcppcbnew, 0, sizeof( struct tcp_pcb ) ) ;
  memset( tcppcbconn, 0, sizeof( struct tcp_pcb ) ) ;
  myfree( SRAMIN, tbuf ) ;
}

27.1.2 tcp_server.h代碼編寫(xiě)

#ifndef _TCP_SERVER_DEMO_H_
#define _TCP_SERVER_DEMO_H_
#include "sys.h"
#include "lwip/tcp.h"
#include "lwip/pbuf.h"
#define TCP_SERVER_RX_BUFSIZE  2000          //定義tcp server最大接收數(shù)據(jù)長(zhǎng)度
#define TCP_SERVER_PORT      8088          //定義tcp server的端口
//tcp服務(wù)器連接狀態(tài)
enum tcp_server_states
{
  ES_TCPSERVER_NONE = 0,      //沒(méi)有連接
  ES_TCPSERVER_ACCEPTED,      //有客戶端連接上了
  ES_TCPSERVER_CLOSING,      //即將關(guān)閉連接
};
//LWIP回調(diào)函數(shù)使用的結(jié)構(gòu)體
struct tcp_server_struct
{
  u8 state;              //當(dāng)前連接狀
  struct tcp_pcb *pcb;        //指向當(dāng)前的pcb
  struct pbuf *p;          //指向接收/或傳輸?shù)膒buf
}; 
void tcp_server_test( void ) ;                  //TCP Server測(cè)試函數(shù)
#endif

27.1.3 主函數(shù)代碼編寫(xiě)

#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_server.h"
int main()
{
  u8 buf[ 30 ];
   STM32_Clock_Init( 9 ) ;                                        //系統(tǒng)時(shí)鐘設(shè)置
  SysTick_Init( 72 ) ;                          //延時(shí)初始化
  USART1_Init( 72, 115200 ) ;                      //串口初始化為115200
  LCD_Init() ;                            //初始化LCD
  TIM3_Init( 1000, 719 ) ;                        //定時(shí)器3頻率為100hz
  my_mem_init( SRAMIN ) ;                      //初始化內(nèi)部?jī)?nèi)存池
  while( lwip_comm_init() ) ;                      //lwip初始化
  //等待DHCP獲取成功/超時(shí)溢出
  while( ( lwipdev.dhcpstatus!=2 )&&( lwipdev.dhcpstatus!=0xFF ) )
  {
    lwip_periodic_handle() ;                    //LWIP內(nèi)核需要定時(shí)處理的函數(shù)
    lwip_pkt_handle() ;
  }
  POINT_COLOR=RED;
  LCD_ShowString( 30, 110, "LWIP Init Successed" ) ;
  //打印動(dòng)態(tài)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] ) ;
  //打印靜態(tài)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 ) ; 
  //得到網(wǎng)速
  if( ( DM9000_Get_SpeedAndDuplex()&0x02 )==0x02 )
    LCD_ShowString( 30, 150, "Ethernet Speed:10M" ) ;
  else
    LCD_ShowString( 30, 150, "Ethernet Speed:100M" ) ;
   while( 1 )
  {
    tcp_server_test() ;                        //TCP服務(wù)器測(cè)試
    lwip_periodic_handle() ;
    lwip_pkt_handle() ;
    delay_ms( 2 ) ;
  }
}

27.2 實(shí)驗(yàn)結(jié)果

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8866

    瀏覽量

    84959
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1465

    瀏覽量

    61682
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1337

    瀏覽量

    78865
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    串口服務(wù)器——TCP Server

    。在實(shí)際應(yīng)用中,我們經(jīng)常會(huì)遇到需要將串口數(shù)據(jù)轉(zhuǎn)發(fā)到TCP服務(wù)器或?qū)?b class='flag-5'>TCP服務(wù)器數(shù)據(jù)轉(zhuǎn)發(fā)到串口的情況,所以本文將介紹如何實(shí)現(xiàn)串口接入TCP
    的頭像 發(fā)表于 07-31 17:58 ?1529次閱讀
    串口<b class='flag-5'>服務(wù)器</b>——<b class='flag-5'>TCP</b> Server

    LABVIEW實(shí)現(xiàn)網(wǎng)絡(luò)通信的方法

    ︱Variable選項(xiàng),然后根據(jù)提示一步一步即可完成設(shè)置,但需要注意的是要實(shí)現(xiàn)網(wǎng)絡(luò)通信變量類(lèi)型必須選擇為“Network-Published”。這里在服務(wù)器中創(chuàng)建一個(gè)名為Server_Variable的共享
    發(fā)表于 12-12 18:02

    四種在LabVIEW中實(shí)現(xiàn)網(wǎng)絡(luò)通信的方法

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

    基于LABVIEW實(shí)現(xiàn)網(wǎng)絡(luò)通信的方法

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

    為什么網(wǎng)絡(luò)通信實(shí)驗(yàn)TCP客戶端模式時(shí)連接不上?

    戰(zhàn)艦V3上的實(shí)驗(yàn)50 網(wǎng)絡(luò)通信實(shí)驗(yàn),當(dāng)用TCP服務(wù)器模式時(shí),通信正常,用TCP客戶端模式時(shí)連接不
    發(fā)表于 08-16 04:35

    如何才能讓網(wǎng)絡(luò)通信實(shí)驗(yàn)支持10個(gè)UDP鏈接?

    大家好,我在使用探索者STM32F4開(kāi)發(fā)板,寄存例程,實(shí)驗(yàn)55 網(wǎng)絡(luò)通信實(shí)驗(yàn)。我修改了例程,想創(chuàng)建10個(gè)UDP端口監(jiān)聽(tīng),udppcb=udp_new()這里最多只能創(chuàng)建5個(gè),5個(gè)之后
    發(fā)表于 08-27 22:48

    為什么網(wǎng)絡(luò)通信實(shí)驗(yàn)網(wǎng)絡(luò)助手上接受到的先是456個(gè)字節(jié)?

    網(wǎng)絡(luò)通信實(shí)驗(yàn)里將ARMF407配置成sever,通過(guò)電腦上網(wǎng)絡(luò)助手接受ARM發(fā)送到數(shù)據(jù),將tcp_sever_sendbuf[1000]改成一個(gè)1000的大數(shù)組并賦值,但是在網(wǎng)絡(luò)助手
    發(fā)表于 09-02 02:54

    請(qǐng)問(wèn)誰(shuí)有F407網(wǎng)絡(luò)通信實(shí)驗(yàn)的視頻嗎?

    請(qǐng)問(wèn)有沒(méi)有F407網(wǎng)絡(luò)通信實(shí)驗(yàn)的視頻啊,能方便給個(gè)鏈接或者地址嗎,謝謝了,急用嘞
    發(fā)表于 09-23 01:49

    STM32F103上網(wǎng)絡(luò)通信實(shí)驗(yàn)服務(wù)器與客戶端連接但不能進(jìn)行數(shù)據(jù)交換該怎么辦?

    我在應(yīng)用原子哥的103板子的網(wǎng)絡(luò)通信實(shí)驗(yàn)時(shí),發(fā)現(xiàn)了一個(gè)小問(wèn)題,就是在服務(wù)器模式下,板子可以與很多的客戶端建立連接,但是在進(jìn)行數(shù)據(jù)交換時(shí),卻只能和第一個(gè)連上的客戶端進(jìn)行數(shù)據(jù)交換,只有在于這個(gè)客戶端斷開(kāi)
    發(fā)表于 10-15 04:37

    為什么f4+ucosiii+lwip1.4.1連接服務(wù)器會(huì)返回錯(cuò)誤碼-10?

    f4+ucosiii+lwip1.4.1+lan8720采用原子哥的開(kāi)發(fā)板帶操作系統(tǒng)的移植代碼,網(wǎng)絡(luò)部分的執(zhí)行代碼也是以開(kāi)發(fā)板例子“實(shí)驗(yàn)55 網(wǎng)絡(luò)通信實(shí)驗(yàn)”為基礎(chǔ)移植的然后開(kāi)發(fā)板作為c
    發(fā)表于 10-16 01:47

    如何把stm32f407網(wǎng)絡(luò)通信實(shí)驗(yàn)調(diào)通?

    最近在做網(wǎng)絡(luò)通信實(shí)驗(yàn),沒(méi)有調(diào)通,有沒(méi)有大神指點(diǎn)一下
    發(fā)表于 10-30 04:35

    請(qǐng)問(wèn)探索者網(wǎng)絡(luò)通信實(shí)驗(yàn)的控制網(wǎng)頁(yè)該怎么寫(xiě)呢?

    原子哥雖然有比較詳細(xì)的講解了網(wǎng)絡(luò)通信實(shí)驗(yàn),但是對(duì)于那個(gè)控制網(wǎng)頁(yè)怎么寫(xiě)的卻沒(méi)有過(guò)多的涉及,請(qǐng)問(wèn)有誰(shuí)會(huì)寫(xiě)這種控制網(wǎng)頁(yè)的,誠(chéng)心求教!
    發(fā)表于 11-06 04:35

    基于原子STM32F4的攝像頭與網(wǎng)絡(luò)通信實(shí)驗(yàn)

    應(yīng)單片機(jī)課設(shè)要求,做了一個(gè)攝像頭拍照網(wǎng)絡(luò)通信C/S實(shí)時(shí)LCD顯示。該工程基于原子STM32F4的攝像頭與網(wǎng)絡(luò)通信實(shí)驗(yàn),在此基礎(chǔ)上,將其整合。1.預(yù)期功能:攝像頭拍取的內(nèi)容實(shí)時(shí)傳輸至LCD進(jìn)行顯示通過(guò)
    發(fā)表于 08-03 06:04

    基于TCP/IP的網(wǎng)絡(luò)通信應(yīng)用程序分享

    -IP網(wǎng)絡(luò)通信應(yīng)用程序(TCP-Client)本章節(jié),將以服務(wù)端的角色進(jìn)行講解,如何開(kāi)發(fā)一個(gè)TCP服務(wù)端(
    發(fā)表于 12-23 08:12

    有線網(wǎng)絡(luò)通信實(shí)驗(yàn)3TCP客戶端

    ,TCP先把數(shù)據(jù)流分割成適當(dāng)長(zhǎng)度的報(bào)文段,最大傳輸段的長(zhǎng)度MSS通常受計(jì)算機(jī)連接的網(wǎng)絡(luò)的數(shù)據(jù)鏈路層的最大傳輸單元MTU控制,之后TCP才把數(shù)據(jù)包傳給IP層,通過(guò)它來(lái)將數(shù)據(jù)傳送給接收端的TCP
    的頭像 發(fā)表于 03-01 14:27 ?1373次閱讀
    <b class='flag-5'>有線網(wǎng)絡(luò)通信實(shí)驗(yàn)</b>3<b class='flag-5'>之</b><b class='flag-5'>TCP</b>客戶端