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操作。監控多個檔案控制代碼可以達到提高就緒狀態出現的概率,就可以...