TCP實現標準客戶 服務模式(停 等模式)

2021-08-01 08:22:25 字數 1651 閱讀 3411

相關網路程式設計函式:

服務端流程:

1.初始化套結字

2.bind

3.listen

4.阻塞於accept,等待客戶端連線

5.有客戶端連線到達,父程序通過fork建立子程序對其處理,父程序關閉連線,繼續監聽

程式:

int main(int argc,char **argv)

close(connfd);

}}void str_echo(int sockfd)

printf("no client to serve! i am exiting!");

}

如果客戶端關閉連線,那麼接受到客戶的fin將導致伺服器子程序的read返回0,這又導致str_echo函式返回,從而中止子程序。

客戶端流程:

1.初始化套結字

2.通過connect建立與伺服器的連線

3.str_cli完成處理工作

程式:

int main(int argc,char **argv)

sockfd=socket(af_inet,sock_stream,0);

bzero(&servaddr,sizeof(servaddr));

servaddr.sin_family=af_inet;

servaddr.sin_port=htons(serv_port);

inet_pton(af_inet,argv[1],&servaddr.sin_addr);

connect(sockfd,(sa *)&servaddr,sizeof(servaddr));

str_cli(stdin,sockfd);

exit(0);

}void str_cli(file *fp,int sockfd)

printf("got message from server:%s\n\n",recvline);

}close(sockfd);

}

當遇到檔案結束符或錯誤時,fgets將返回乙個空指標,於是客戶處理迴圈中止。

問題:

當伺服器子程序終止時,給父程序傳送了乙個sigchld訊號,但是我們並沒有在**中捕獲該訊號,該訊號的預設處理是被忽略。因為父程序未加處理,子程序於是進入僵死狀態。

於是,我們在服務端程式中加入訊號處理函式

void sig_cld(int signo)

有了訊號處理函式,我們在服務端的main函式中再新增上相應的呼叫即可。

問題:

但是當父程序阻塞於accpet時,子程序可能會終止,sig_chld函式執行。因為該訊號是父程序阻塞於慢系統呼叫時由父程序捕獲的,核心可能會使accept返回乙個eintr錯誤(被中斷的系統呼叫),而父程序不處理該錯誤,於是父程序終止,服務端程式結束。

為了程式的穩定性和可移植性,對accept函式進行失敗情況的處理。

最終的tcp伺服器程式main函式如下:

int main(int argc,char **argv)

}if((childpid=fork())==0)

close(connfd);

}}

簡單程序池實現多TCP客戶服務

根據預定義程序數建立程序池。父子程序通訊使用的ipc方式為 unix域套接字 父程序listen,aeecpt,並將連線套接字傳送到子程序,交由子程序處理該連線。子程序處理完畢,與父程序通訊,實現資源 並在下一連線到來交由該完畢的子程序。include unp.h include define id...

winsock實現基於TCP的客戶端 伺服器通訊

一 伺服器端程式 include include pragma comment lib,ws2 32.lib 或者在專案屬性的聯結器的輸入的附加依賴項中新增ws2 32.lib define port 5000 void main slisten socket af inet,sock stream...

簡單實現TCP服務端與客戶端

1 include2 include3 include4 include5 include6 include7 include8 include9 10 tcp服務端 簡單的網路聊天程式 11 1 建立socket 12 2 為socket繫結位址埠 13 3 開始監聽socket 告訴作業系統,開...