Linux網路程式設計之迴圈伺服器

2021-06-21 23:23:02 字數 4077 閱讀 4116

1.介紹

linux網路迴圈伺服器是指逐個處理客戶端的連線,處理完乙個連線後再處理下乙個連線,是乙個序列處理的方式,比較適合時間伺服器,dhcp伺服器.對於tcp伺服器來說,主要阻塞在accept函式,等待客戶端的連線。而對於udp伺服器來說,主要阻塞在recv函式.

2.迴圈伺服器模型

tcp迴圈伺服器:

演算法如下: 

socket(...);

bind(...);

listen(...);

while(1)

close(....);//關閉伺服器連線

udp迴圈伺服器:

演算法如下: 

socket(...)

bind(....);

while(1)

close(....);//關閉伺服器連線

從上面的流程可以看出,tcp迴圈伺服器在accept處阻塞一直等待客戶端的到來,而udp迴圈伺服器在recv處阻塞,等待客戶端傳送資料.

3. 迴圈伺服器的例子

下面的程式是乙個時間伺服器,客戶端發出time時間請求,伺服器將本地時間返回給客戶端.

(1)tcp迴圈伺服器

伺服器:

#include

#include

#include

#include

#include

#include

#include

/**tcp迴圈伺服器

在accept處阻塞等待客戶端的連線,並處理請求

**/#define port 8888

#define buffersize 1024

#define listen 10

int main(int argc,char*argv)

//將位址繫結到套接字上

memset(&server_addr,0,sizeof(server_addr));

server_addr.sin_family=af_inet;

server_addr.sin_addr.s_addr=htonl(inaddr_any);

server_addr.sin_port=htons(port);

ret=bind(s,(struct sockaddr*)&server_addr,sizeof(server_addr));

if(ret<0)

//監聽佇列的長度

listen(s,listen);

len=sizeof(client_addr);

//接受客戶端的請求

while(1)

else if(!strncmp(buffer,"time",4))

close(sc);//關閉本次通訊的客戶端連線

}close(s);

return 0;

}客戶端:

#include

#include

#include

#include

#include

#include

#include

/**迴圈伺服器客戶端程式

**/#define port 8888

#define buffersize 1024

int main(int argc,char*argv)

bzero(&server_addr,sizeof(server_addr));

//將位址結構繫結到套接字

server_addr.sin_family=af_inet;

server_addr.sin_port=htons(port);

server_addr.sin_addr.s_addr=htonl(inaddr_any);

//連線伺服器

ret=connect(s,(struct sockaddr*)&server_addr,sizeof(server_addr));

if(ret==-1)

memset(buffer,0,buffersize);

strcpy(buffer,"time");

size=send(s,buffer,strlen(buffer),0);

if(size<0)

memset(buffer,0,buffersize);

size=recv(s,buffer,buffersize,0);

if(size<0)

printf("%s",buffer);

close(s);

return 0;

}執行結果:

[root@localhost 14章伺服器模式]# ./circle-tcpc14

sat feb 18 09:44:31 2012

(2)udp迴圈伺服器

伺服器:

#include

#include

#include

#include

#include

#include

#include

/**udp迴圈伺服器

原理:伺服器在recv函式與處理業務之間輪循處理

**/#define port 8888

#define buffersize 1024

int main(int argc,char*argv)

//位址繫結

bzero(&server_addr,sizeof(server_addr));//位址結構清0

server_addr.sin_family=af_inet;

server_addr.sin_addr.s_addr=htonl(inaddr_any);

server_addr.sin_port=htons(port);

ret=bind(s,(struct sockaddr*)&server_addr,sizeof(server_addr));

if(ret==-1)

//資料報套接字沒有流量控制所以沒有監聽listen,也沒有三次握手,所以沒有接受連線accept

while(1)else}}

close(s);

return 0;

}客戶端:

#include

#include

#include

#include

#include

#include

#include

/**udp客店端,客戶端向伺服器傳送時間請求,伺服器返回相應的時間

**/#define port 8888

#define buffersize 1024

int main(int argc,char*argv)   

bzero(&server_addr,sizeof(server_addr));

server_addr.sin_family=af_inet;

server_addr.sin_addr.s_addr=htonl(inaddr_any);

server_addr.sin_port=htons(port);

memset(buffer,0,buffersize);

strcpy(buffer,"time");

//向伺服器傳送資料

size=sendto(s,buffer,strlen(buffer),0,(struct sockaddr*)&server_addr,sizeof(server_addr));

if(size<0)

//從伺服器接收資料

len=sizeof(server_addr);

size=recvfrom(s,buffer,buffersize,0,(struct sockaddr*)&server_addr,&len);

if(size<0)

//write(1,buffer,size);

printf("%s\n",buffer);

close(s);

return 0;

}執行結果:

[root@localhost 14章伺服器模式]# ./circle-udpc14

sat feb 18 09:59:22 2012

總結:本文主要介紹了迴圈伺服器的演算法流程,並且給出了tcp與udp迴圈伺服器例項.

Linux網路程式設計之迴圈伺服器

1.介紹 linux網路迴圈伺服器是指逐個處理客戶端的連線,處理完乙個連線後再處理下乙個連線,是乙個序列處理的方式,比較適合時間伺服器,dhcp伺服器.對於tcp伺服器來說,主要阻塞在accept函式,等待客戶端的連線。而對於udp伺服器來說,主要阻塞在recv函式.2.迴圈伺服器模型 tcp迴圈伺...

Linux網路程式設計之迴圈伺服器

1.介紹 linux網路迴圈伺服器是指逐個處理客戶端的連線,處理完乙個連線後再處理下乙個連線,是乙個序列處理的方式,比較適合時間伺服器,dhcp伺服器.對於tcp伺服器來說,主要阻塞在accept函式,等待客戶端的連線。而對於udp伺服器來說,主要阻塞在recv函式.2.迴圈伺服器模型 tcp迴圈伺...

Linux網路程式設計之select伺服器

一 關於i o 一次i o分兩個部分 等待資料就緒 進行i o 減少等的比重,增加i o的比重就可以達到高效伺服器的目的。select工作原理就是這個,同時監控多個檔案描述符 或者說檔案控制代碼 一旦其中某乙個進入就緒狀態,就進行i o操作。監控多個檔案控制代碼可以達到提高就緒狀態出現的概率,就可以...