STM32 LWIP伺服器實現多客戶端連線

2021-10-09 18:45:19 字數 3302 閱讀 2176

用過正點原子lwip伺服器例程開發的朋友可能知道,例程的設計是只支援乙個客戶端連線的,但實際應用中往往需要用到多客戶端連線。下面是在正點原子擴充套件例程 網路實驗14 netconn_tcp 伺服器(ucosiii版本) 的基礎上進行修改,實現多客戶端連線的乙個方法。

建立乙個tcp伺服器需要經過

建立連線

conn=netconn_new(netconn_tcp); //建立乙個tcp鏈結

繫結埠號

netconn_bind(conn,ip_addr_any,tcp_server_port); //繫結埠 8088號埠監聽

netconn_listen(conn); //進入監聽模式

接收連線請求

err = netconn_accept(conn,&newconn); //接收連線請求

等步驟。而例程裡將這些步驟都放在了同乙個任務執行緒裡面去操作,一旦接收到連線就進入while (1) 死迴圈裡傳輸資料,這當然會限制連線。要實現多客戶端連線,那就得把這些步驟分開來操作。

我們可以分成三個任務執行緒來實現多客戶端的連線。第乙個用來建立tcp伺服器以及監聽接收連線請求;第二個用來處理連線成功之後的資料傳輸以及斷開連線等操作;另外乙個任務專門用來建立第二個任務執行緒,這是為了方便記憶體以及連線數量和狀態的管理。

首先定義乙個結構體方便管理客戶端

#define clientmax   20 

//最大客戶端連線數量

//客戶端任務結構體

typedef

struct

tcp_client;

//客戶端位址結構體

typedef

struct

client_ad;

client_ad clientad;

//tcp客戶端位址結構體(全域性變數)

然後是第乙個任務執行緒:建立tcp伺服器

void

svr_task

(void

*arg)

}ostimedlyhmsm(0

,0,0

,5,0

,&oserr)

;//延時 5ms (任務切換)

}}

第二個任務執行緒:建立客戶端 client_init()

err_t client_init

(void

*arg)

client->clientstk=

(cpu_stk*

)mymalloc

(sramdtcm,

1024);

//給裝置結構體內任務堆疊分配空間(1024位元組)

if(client->clientstk ==

null

)for

(clientnum=

1;clientnum)//迴圈檢測客戶端連線狀態(定義最多20個客戶端)

}cpu_critical_enter()

;//進入臨界區(**保護 關中斷)

//建立tcp客戶端任務

ostaskcreate

((os_tcb *

)(client->clienttcb)

,(cpu_char *

)"tcp_server task"

,(os_task_ptr )tcp_server_thread,

(void

*)client,

(os_prio )10,

//9+clientnum

(cpu_stk *

)(client->clientstk)

,(cpu_stk_size)

256/10,

(cpu_stk_size)

256,

(os_msg_qty )0,

(os_tick )0,

(void*)

0,(os_opt )os_opt_task_stk_chk|os_opt_task_stk_clr,

(os_err *

)&err)

;cpu_critical_exit()

;//退出臨界區(開中斷)

client_count++;if

(err != os_err_none)

clientad.state[clientnum]=1

;//第 clientnum 個客戶端連線狀態置1(已連線)

return err_ok;

//返回錯誤資訊

}

這個任務開頭部分可能看著有些複雜,但其實就是給乙個變數申請記憶體以及申請失敗的一些處理,應該還是不難理解的。

最後乙個任務執行緒:客戶端執行緒

static

void

tcp_server_thread

(void

*arg)

os_critical_exit()

;//開中斷

recv_err =

netconn_write

(client->conn ,tcp_server_sendbuf,data_len,netconn_copy)

;//傳送tcp_server_sendbuf中的資料

data_len=0;

//複製完成後data_len要清零。

netbuf_delete

(recvbuf);}

else

if(recv_err == err_clsd||recv_err==err_rst)

//關閉連線或復位資料

break

;// if(lan8720_status_link_down == lan8720_getlinkstate()) //網線未連線

// online_check = 1;

lan8720_readphy

(lan8720_bsr,

&readval)

;//獲取連線狀態(硬體,網線的連線,不是tcp、udp等軟體連線!) if(

(readval&lan8720_bsr_link_status)==0

) online_check =1;

else

online_check =0;

if(online_check)

break;}

if(clientad.state[client->num]==1

)}

mysql多伺服器 mysql 多伺服器例項

測試環境是在windows下。不同系統啟動和停止命令有所差異 1 修改配置檔案 把需要配置的選項都設定成不一樣的 需要修改的地方有 client password your password port 3308 經過測試,這個埠改不改都沒什麼問題,但是還是改了保險點吧 socket d servic...

mysql多伺服器 單伺服器多mysql伺服器

mkdir home mysql servers mysql330 p useradd g mysql mysql3307 s bin nologin d home mysql servers mysql3307 tar xf mysql.tar.gz cd mysql configure pref...

PHP實現多伺服器SESSION共享

現在稍微大一點的 基本上都有好幾個子網域名稱,比如www.feiniu.com,search.feiniu.com,member.feiniu.com,這些 如果需要共用使用者登入資訊,那麼就需要做到session共享,當然前提是有相同的主域。客戶端訪問php頁面,執行session start,生...