#include//標準庫 #include//標準輸出 #include//錯誤編號 #include//字符串 #include//sock #include//類型 #include//用到網(wǎng)絡函數(shù)中的結(jié)構(gòu)體需要引入的頭文件 #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));//清空地址結(jié)構(gòu)體緩沖區(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);//關(guān)閉接收套接字 ????????exit(0); ???} ???else?if(n<0) ????????printf("Fork?Error:%sna",strerror(errno)); ???close(accept_fd); ??} }