server c客戶端伺服器select 趙超越

2021-07-10 20:28:48 字數 2679 閱讀 6797

班級:09

計算機應

用技術1班

姓名:趙超越

學號:0906041011

/* server.c */

#include

#include

#include

#include

#include "wrap.h"

#define maxline 80

/*巨集定義 maxline 為 80*/

#define serv_port 8000/*

巨集定義 埠號為 8000*/

int main(int argc, char **argv)

if (i == fd_setsize)

fd_set(connfd, &allset);

/*將新的檔案描述符connfdt新增到allset中 *

/if (connfd > maxfd)

maxfd = connfd; /*

如果connfd > maxfd,

則將connfd的值賦給maxfd,使

得maxfd存放的是最大的檔案描述符*/

if (i > maxi)

maxi = i;    /*

如果i > maxi,

將i的值賦給maxi,使得

maxi存放的是值最大的i*

/if (--nready == 0)

continue;   /*

當nready為0,沒有可讀的檔案描述符,

則結束本次迴圈

。並開始

執行下一次迴圈*/

}for (i = 0; i <= maxi; i++) else

if (--nready == 0)

break;    /

*當nready為0,沒有可讀的檔案描述符,結束本次迴圈*/}

}}}執行過程:

首先系統呼叫

socekt

返回乙個檔案描述符

listenfd監聽serv_port埠。

然後呼叫bind

所描述的位址(本地

任意ip位址)和埠號(8000)

。 伺服器呼叫

listen()宣告sockfd處於監聽狀態,並且最多允許有20個客戶端處於連接待狀態,如果接收到更多的連線請求就忽略。

然後把listenfd

加入allset

集合中。

調 用select()函式判斷rset 中存放的listenfd 是否有資料到達,現在有乙個檔案描述符listenfd 在rset 中,假設有資料到達返回1賦給nready , 判斷 nready 不小於0,所以不出錯。接著伺服器呼叫accept()接受連線,如果伺服器呼叫accept()時還沒有客戶端的連線請求,就阻塞等待直到有客戶端連線 上來。

當集合裡有可讀的socket時,select返回。select返回後,判斷是否是listenfd可讀,如果

為真,則說明有新的客戶端連線

進來,然後

呼叫accept函式

進行接收

,accept()返回時

返回乙個

伺服器與客戶端互相通訊的檔案描述符connfd

,存放傳出客戶端的位址和埠號

並列印。

accept

得到的connfd儲存到客戶端列表裡(

client[i

]陣列中的第乙個位置

),通過if 語句判斷i 不等於fd_setsize退出。把最大的描述符新增到allset集中,把最大的i 值賦給maxi ,

nready = 1繼續返回執行for迴圈,重新等待監聽來自客戶端的連線請求。

把client[i] 中第乙個元素(即第乙個檔案描述符listenfd )賦給sockfd 不小於0執行下面的if 語句,判斷sockfd(listenfd )在rset 集中,接著判斷客戶端是否關閉連線

。若已經關閉連線,將sockfd(listenfd )從allset 集中清除,將client[i]的第乙個元素賦值為-1

。若沒有關閉連線,將接收到的來自客戶端的資料由小寫轉換為大寫,重新返回給客戶端

。果客戶端斷開,那麼從client列表和集合裡去除掉。

連線關閉後,

此時nready = 1

執行「——」操作後

後等於0

,沒有更多的檔案描述符,結束本次迴圈,進入下一次for迴圈,重新監聽來自客戶端的連線請求。

執行結果:

終端1:

[root@localhost ~]#cd /opt/zcy/

[root@localhost zcy]#gcc server.c -o server

[root@localhost zcy]#./server

received from 127.0.0.1 at port 50275

received from 127.0.0.1 at port 50276

終端2:

[root@localhost zcy]# ./client

zcyzcy

nypd

nypd

wwwwww

終端3:

[root@localhost ~]# cd /opt/zcy/

[root@localhost zcy]# ./client

zhongduan3

zhongduan3

0 給主人留下些什麼吧!~~

server c客戶端伺服器 餘姍姍

09計應一班餘姍姍 server.c include 包含標準函式庫中輸入輸出函式的標頭檔案 include 包含標準庫函式的標頭檔案 include 包含字元陣列函式定義的標頭檔案 include ipv4和ipv6的位址格式定義在netinet in.h中 include wrap.h 系統函式...

伺服器與客戶端

建立socket操作,建立流式套接字,返回套接字型大小socksrv socket socket int af,int type,int protocol 第乙個引數,指定位址簇 tcp ip只能是af inet,也可寫成pf inet socket socksrv socket af inet,s...

UDP 客戶端伺服器

udp 客戶端 include include include include include define size 100 define ip 127.0.0.1 define port 10086 int main struct sockaddr in addr 建立socket udp so...