server的注釋與執行過程
計算機與資訊工程學院09級嵌入式方向劉文華
/* server.c */
#include
#include
#include
#include
#include "wrap.h"
#define maxline 80
#define serv_port 8000
int main(int argc, char **argv)
if (i == fd_setsize)
fd_set(connfd, &allset);/* add new descriptor to set */
新增connfd到allset集合中
if (connfd > maxfd)
//比較新新增的connfd與maxfd;
maxfd = connfd; /* for select */
把最大編號的fd放到maxfd中;
if (i > maxi)
maxi = i;/* max index in client array */
if (--nready == 0)
//判斷是否有檔案可讀;
continue;/* no more readable descriptors */
}
for (i = 0; i <= maxi; i++) else
if (--nready == 0)
//再次判斷是否有可讀取的資料;
break;/* no more readable descriptors */
} }
} }
程式的執行過程:
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = af_inet;
servaddr.sin_addr.s_addr = htonl(inaddr_any);
servaddr.sin_port = htons(serv_port);
呼叫以 上四句對band()中的server進行初始化,首先將結構體server清零,設定位址型別為af_inet,網路位址為inaddr_any,埠 號我們定義為8000。呼叫bind()將引數sockfd和剛才初始化的server繫結在一起。然後呼叫listen()宣告listenfd處於監 聽狀態,並且規定最多允許20個客戶端處於連線狀態,如果接到更多的連線請求就忽略。把監聽到fd放到maxfd中。定義maxi,使用for()迴圈, 對client進行初始化為-1,表示沒有客戶端連線。然後先清空allset集合,然後再把剛才監聽到的listenfd檔案描述符放到allset這 個檔案描述符集合中。
在for()死迴圈中,首先將allset集合中的資料賦值給rset,然後呼叫select()判斷在rset這個集合中是否有可以從這些所包含的檔案中讀取資料。客戶端有幾個請求則返回的數是幾。並將這個數儲存到nready中。
if是判斷若是呼叫select()出錯,列印出提示資訊。
此時select()的返回值此時nready=1大於零,所以執行
if判斷listenfd在tset中,accept()就開始執行,接受乙個新的客戶端請求,將新的客戶端的位址和埠號放在新生成乙個檔案描述符中並將這個檔案描述符賦給connfd。
然後呼叫printf()列印出客戶端的傳送連線請求的伺服器的位址並把客戶端的埠列印出來。執行for迴圈,此時client[0
]=-1, 把新接受的connfd放到client這個陣列中。終止此次的for迴圈。然後將connfd放到allset這個集合中,並將此時最大的檔案描述符放 到maxfd中,這時allset中包含listenfd和connfd,i中存放的是最大的檔案描述符,把i賦給maxi。
把allset
集合裡 的新新增的connfd放到,rset集合中,假設現在這兩個檔案中都有資料可讀取,當執行select()時nready=2,for()迴圈中前面的 執行同上分析,--nready!=0,所以執行下乙個for(),進入for語句把connfd賦給sockfd,因為connfd有連線請求並判斷客 戶端沒有關閉連線,接收來自客戶端的資料並將小寫裝換為大寫重新返回給客戶端;如果客戶端關閉連線,伺服器端也關閉連線,並從allset清除 sockfd的檔案描述符.把ready的值自減1,nready為0,沒有更多的檔案描述符,結束本次迴圈.進入下次for迴圈,重新監聽來自客戶端的 連線請求.
實驗執行結果:
伺服器端:
[root@localhost
wodechengxu
]# gcc server.c -o server.o
[root@localhost wodechengxu]# ./server.o
received from 127.0.0.1 at port 38509
received from 127.0.0.1 at port
45203
c客戶端1:
[root@localhost
wodechengxu
]# gcc client.c -o client.o
[root@localhost
wodechengxu
]# ./client.o
wodemingzi
wodemingzi
liuliu
xuexi
xuexi
客戶端2:
[root@localhost
wodechengxu
]# ./client.o
fffffff
fffffff
gggggg
gggggg
關閉伺服器端後的客戶端:
[root@localhost
wodechengxu
]# ./client.o
connect error: connection refused
0 給主人留下些什麼吧!~~
i 與 i 的執行過程
經常遇到一連串的 i 或者 i 相加,問最後執行的結果和 i 的值 i.g int i 1 int y 0 y i i 分析一下它的彙編 沒有經過優化 subl 40,esp 分配40位元組 movl 1,16 ebp 儲存 i movl 0,12 ebp 儲存 y movl 16 ebp eax ...
js的解析與執行過程
當輸入如下 時候 var a 1 function crli crli 1結果為 1 當改變下面 時候 var a 1 function crli crli undefined結果為 undefined 這是為什麼呢?js解析與執行過程一共有2個階段,乙個預處理階段,乙個是執行階段 可以看成全域性預...
JUnit注釋的執行順序
注釋就好像你可以在你的 中新增並且在方法或者類中應用的元標籤。junit 中的這些注釋為我們提供了測試方法的相關資訊,哪些方法將會在測試方法前後應用,哪些方法將會在所有方法前後應用,哪些方法將會在執行中被忽略。序號注釋和描述 1 test這個注釋說明依附在 junit 的 public void 方...