院系:計算機與資訊工程學院班級: 09計算機應用二班
姓名:趙曉曉(09嵌入式方向) 學號:0906042051
2009嵌入式 server-client 伺服器-客戶端
/* server.c */
#include
#include
#include
#include
#include "wrap.h"
#define maxline 80 /*通道最大為80*/
#define serv_port 8000 /*巨集定義埠號為8000*/
int main(int argc, char **argv)
if (i == fd_setsize)
fd_set(connfd, &allset); /* 把新得到的檔案描述connfd符寫入allset集合中 */
if (connfd > maxfd) /*設定最大檔案描述符*/
maxfd = connfd; /* for select */ /*將最新的描述符儲存在maxfd*/
if (i > maxi) /*設定i的最大值*/
maxi = i; /* max index in client array */ /*將已有的連線總數儲存在maxi裡*/
if (--nready == 0) /*當nready為0,沒有更多的檔案描述符,結束本次迴圈*/
continue; /* no more readable descriptors */
}
for (i = 0; i <= maxi; i++) else
if (--nready == 0) /*當nready=0時,資料處理完,結束本次迴圈*/
break; /* no more readable descriptors */
}
}
}
}
/*執行過程:
呼叫函式socket(),成功返回一套接字檔案描述符賦值給listenfd.
然後將結構體servaddr清空,設定ipv4位址型別為af_inet,naddr_any為本地的任意ip位址,埠號巨集定義為8000.
呼叫函式bind(),將本地的套接字listenfd與伺服器網路位址和埠號繫結在一起
在伺服器端呼叫listen()數來監聽客戶端狀態.將監聽到的檔案描述符listenfd賦給maxfd,給maxi賦初值為-1,使用for迴圈對陣列client初始化,將allset集合清空,把監聽到的檔案描述listenfd符寫入allset集合中
進入for迴圈,把allset裡的檔案描述符賦給rset(把listenfd的檔案描述符賦給rset).
呼叫select函式,當客戶端有連線請求時,將客戶端請求個數返回給nready,如果有乙個請求,則nready = 1.
if判斷nready不小於0,不出錯.此時檔案描述符listenfd在集合rset中,就執行accept()函式,返回乙個新的檔案描述符賦給 connfd.列印出客戶端的ip位址與埠號.將新得到的檔案描述符connfd儲存到陣列client中.把新得到的檔案描述connfd符寫入 allset集合中,通過if語句把allset中的檔案描述符和i的最大值找出來分別賦給maxfd,maxi.把ready的值自減1,當 nready為0,沒有更多的檔案描述符,結束本次迴圈.此時就只有乙個檔案描述符listenfd,所以nready的值是1,自減後不等於0就不執行 con進入for語句把connfd賦給sockfd因為等於0,就結束本次迴圈.進入下次for迴圈,重新監聽來自客戶端的連線請求.
在本次迴圈中在rset,allset中有倆個檔案描述符分別是listenfd,connfd,如果listenfd沒有資料到達,connfd有資料 到達,則由select得到nready值為1,if判斷rset中的第乙個檔案描述符listenfd沒有連線請求,退出if語句,進入下乙個for循 環.將connfd賦給sockfd.因為connfd有連線請求,並判斷客戶端沒有關閉連線,接收來自客戶端的資料並將小寫裝換為大寫重新返回給客戶 端;如果客戶端關閉連線,伺服器端也關閉連線,並從allset清除sockfd的檔案描述符.把ready的值自減1,當nready為0,沒有更多的 檔案描述符,結束本次迴圈.此時就只有乙個檔案描述符connfd,所以nready的值是1,自減後等於0,就結束本次迴圈.進入下次for迴圈,重新 監聽來自客戶端的連線請求.
在本次迴圈中在rset,allset中有倆個檔案描述符分別是listenfd,connfd,如果linstenfd和connfd都有連線請求,則 select返回值是2,nready旳值也是2.if判斷nready不小於0,不出錯.此時檔案描述符listenfd在集合rset中,就執行 accept()函式,返回乙個新的檔案描述符賦給connfd.列印出客戶端的ip位址與埠號.將新得到的檔案描述符connfd1儲存到陣列 client中.把新得到的檔案描述connfd1符寫入allset集合中,此時allset集合中有三個檔案描述符分別是listenfd、 connfd、connfd1.通過if語句把allset中的檔案描述符和i的最大值找出來分別賦給maxfd,maxi.把ready的值自減 1,nraedy的值是1,1不等於0,就不執行continue,進入for語句把connfd賦給sockfd,因為connfd有連線請求並判斷客 戶端沒有關閉連線,接收來自客戶端的資料並將小寫裝換為大寫重新返回給客戶端;如果客戶端關閉連線,伺服器端也關閉連線,並從allset清除 sockfd的檔案描述符.把ready的值自減1,nready為0,沒有更多的檔案描述符,結束本次迴圈.進入下次for迴圈,重新監聽來自客戶端的 連線請求.
實驗執行結果:
伺服器端:
[root@localhost desktop]# gcc server.c -o server
[root@localhost desktop]# ./server
received from 127.0.0.1 at port 57729
received from 127.0.0.1 at port 57732
客戶端1:
[root@localhost desktop]# gcc client.c -o client
[root@localhost desktop]# ./client
wowowo
wowowo
lsllallal
lsllallal
zhaoxiaoxiao
zhaoxiaoxiao
******
******
ooooooo
ooooooo
客戶端2:
[root@localhost desktop]# gcc client.c -o client
[root@localhost desktop]# ./client
nihsoa
nihsoa
womendouhenhao
womendouhenhao
xiexie
xiexie
nihao
nihao
zhaoxiaoxiao
zhaoxiaoxiao
xiaoxiao
xiaoxiao
xzhao
xzhao
*/
0 給主人留下些什麼吧!~~
nfs服務server client端配置
nfs部署流程 nfs network file system 即網路檔案系統,是freebsd支援的檔案系統中的一種,它允許網路中的計算機之間通過tcp ip網路共享資源。在nfs的應用中,本地nfs的客戶端應用可以透明地讀寫位於遠端nfs伺服器上的檔案,就像訪問本地檔案一樣。當我們在nfs伺服器...
伺服器安裝Linux伺服器
新辦公需要搭建一台伺服器,之前也沒有怎麼搞過,不過有一些了解,於是和同事一起嘗試安裝一下伺服器。本人使用ultraiso燒錄u盤,系統檔案是centos 6.6 x86 64 bin 1.ios,使用urtraiso開啟iso檔案,然後如下圖 接著就可以寫入,u盤會被格式化的,注意備份,等待寫入就可...
mysql udp伺服器 UDP伺服器
傳輸層主要應用的協議模型有兩種,一種是tcp協議,另外一種則是udp協議。tcp協議在網路通訊中佔主導地位,絕大多數的網路通訊借助tcp協議完成資料傳輸。但udp也是網路通訊中不可或缺的重要通訊手段。相較於tcp而言,udp通訊的形式更像是發簡訊。不需要在資料傳輸之前建立 維護連線。只專心獲取資料就...