server client 伺服器 客戶端 趙曉曉

2021-07-10 20:28:48 字數 3688 閱讀 1473

院系:計算機與資訊工程學院班級: 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通訊的形式更像是發簡訊。不需要在資料傳輸之前建立 維護連線。只專心獲取資料就...