#include//標(biāo)準(zhǔn)庫
#include//標(biāo)準(zhǔn)輸出
#include//錯(cuò)誤編號(hào)
#include//字符串
#include//sock
#include//類型
#include//用到網(wǎng)絡(luò)函數(shù)中的結(jié)構(gòu)體需要引入的頭文件
#include//系統(tǒng)文件中的socket頭文件
#define?MY_PORT?1988//我的端口號(hào)碼
?
int?main(int?argc?,char?**argv)
{
?int?listen_fd,accept_fd;//設(shè)置了兩個(gè)套接字描述符???
?struct?sockaddr_in?????client_addr;//設(shè)置了兩個(gè)套接字描述符的地址
?int?n;
?
?if((listen_fd=socket(AF_INET,SOCK_STREAM,0))<0)//誰定監(jiān)聽套接字的屬性
??{
????????printf("Socket?Error:%sna",strerror(errno));
????????exit(1);
??}
?
?bzero(&client_addr,sizeof(struct?sockaddr_in));//清空地址結(jié)構(gòu)體緩沖區(qū)
?client_addr.sin_family=AF_INET;//地址是IPV4
?client_addr.sin_port=htons(MY_PORT);//設(shè)置了對(duì)方套接字想要連接我的時(shí)候用的端口號(hào)碼
?client_addr.sin_addr.s_addr=htonl(INADDR_ANY);//設(shè)置成任何人訪問的套接字
?n=1;
?/*?如果服務(wù)器終止后,服務(wù)器可以第二次快速啟動(dòng)而不用等待一段時(shí)間??*/
?setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int));//******設(shè)置ip地址可以復(fù)用
? //將監(jiān)聽地址設(shè)置成可以復(fù)用
? //第二個(gè)參數(shù)表示協(xié)議所屬等級(jí)
? //第三個(gè)參數(shù)真正的控制選項(xiàng)函數(shù)入口地址
?if(bind(listen_fd,(struct?sockaddr?*)&client_addr,sizeof(client_addr))<0)//綁定套接字
??{
????????printf("Bind?Error:%sna",strerror(errno));//?如果沒有綁定成果則報(bào)錯(cuò)
????????exit(1);//報(bào)錯(cuò)后退出
??}
??listen(listen_fd,5);//設(shè)置套接字最大監(jiān)聽數(shù)目???最多鏈接的套接字的數(shù)目是五個(gè)
??
??
??
??
??while(1)//進(jìn)入循環(huán)
??{
???accept_fd=accept(listen_fd,NULL,NULL);//處理每次監(jiān)聽的fd
??? //接聽套接字的函數(shù)
??? //設(shè)置套接字的屬性
??? //將聽來的套接字?存放到接收處理套接字里面去
???
???if((accept_fd<0)&&(errno==EINTR))//監(jiān)聽沒創(chuàng)建成功,文件打開又錯(cuò)誤
??????????continue;//
???else?if(accept_fd<0)
????{
????????printf("Accept?Error:%sna",strerror(errno));//打印錯(cuò)誤號(hào)碼
????????continue;
????}
??if((n=fork())==0)//如果大于零的話?返回的是父進(jìn)程
???{
????????/*?子進(jìn)程處理客戶端的連接?*/
????????char?buffer[1024];
????????close(listen_fd);//這時(shí)候不在監(jiān)聽套接字
????????n=read(accept_fd,buffer,1024);//每次讀取1024個(gè)字節(jié)
????????write(accept_fd,buffer,n);//讀到n個(gè)就寫到接收里面去
????????close(accept_fd);//關(guān)閉接收套接字
????????exit(0);
???}
???else?if(n<0)
????????printf("Fork?Error:%sna",strerror(errno));
???close(accept_fd);
??}
}