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