用過正點原子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,生...