1. tcp回射示例
伺服器**
#include #include客戶端**#include
#include
#include
#include
in.h>
#define srv_port 8888
#define maxline 4096
void str_echo(int
fd);
int main(int argc, char **argv)
struct
sockaddr_in srvaddr;
bzero(&srvaddr, sizeof
(srvaddr));
srvaddr.sin_family =af_inet;
srvaddr.sin_addr.s_addr =htonl(inaddr_any);
srvaddr.sin_port =htons(srv_port);
if(bind(listenfd, (struct sockaddr*)&srvaddr, sizeof(srvaddr)) < 0
)
if(listen(listenfd, 1023) < 0
)
struct
sockaddr_in cliaddr;
for(; ;)
pid_t childpid;
if( (childpid = fork()) == 0
)
close(connfd);
}return0;
}void str_echo(int
sockfd)}}
#include #include2. 示例啟動過程#include
#include
#include
#include
in.h>
#define srv_port 8888
#define maxline 4096
void str_cli(file *fp, int
sockfd);
int main(int argc, char **argv)
int sockfd = socket(af_inet, sock_stream, 0
);
if(sockfd < 0
)
struct
sockaddr_in srvaddr;
bzero(&srvaddr, sizeof
(srvaddr));
srvaddr.sin_family =af_inet;
srvaddr.sin_port =htons(srv_port);
if(inet_pton(af_inet, argv[1], &srvaddr.sin_addr) <= 0
)
if(connect(sockfd, (struct sockaddr *)&srvaddr, sizeof(srvaddr)) < 0
)
str_cli(stdin, sockfd);
exit(0);
}void str_cli(file *fp, int
sockfd)
if( read(sockfd, readline, maxline) == 0
)
fputs(readline,stdout);}}
客戶端伺服器建立連線後發生的動作:
所以至此有三個阻塞程序:客戶程序,伺服器父程序,伺服器子程序。
3. 示例正常終止過程
4. posix訊號處理(處理3產生的僵死程序)
訊號由乙個程序發給另乙個程序(或自身),也可由核心發給某個程序。
1)呼叫函式sigaction設定乙個訊號的處理有以下三種選擇:
2)signal函式(使用系統提供的)
#include typedef3)處理sigchld訊號(處理僵死程序)void (*sighandler_t)(int
);sighandler_t signal(
int signum, sighandler_t handler);
4)例子
signal(sigchld, sig_child);
void sig_chld(int5)處理被中斷的系統呼叫signo)
for5. wait和waitpid( ; ; )
else}}
#include pid_t wait(int *status);
pid_t waitpid(pid_t pid,
int *status, int options);
status為程序的終止狀態:正常終止,訊號殺死或由作業控制停止。waitpid的pid引數允許我們指定想等待的程序,pid值為-1時表示等待第乙個終止的程序。
void sig_chld(int小結:網路程式設計中可能會遇到的三種情況signo)
return
;}
6. accept返回前連線終止:伺服器在呼叫accept之前收到rst(此種情況在16章再詳細給出)
7.伺服器程序終止
示例程式中,如果伺服器終止,當伺服器發出的fin到達客戶端時,客戶端正阻塞在fgets上等待使用者輸入。客戶端此時要應對兩個描述符(套接字和使用者輸入),它不能單純的阻塞在其中任何乙個源的輸入上,這個涉及到select和poll,第六章繼續討論。
8.sigpipe訊號
9.伺服器主機崩潰
主機崩潰可能導致客戶端長時間(9分鐘左右)對伺服器進行重連,這使得我們有時候需要在更短的時間發現伺服器已經掛掉,此時可以把read設定乙個超時(後面再詳說),或者用so_keepalive套接字選項和一些心跳技術實現(第七章)。
10. 伺服器主機崩潰後重啟
伺服器崩潰後,不向客戶端傳送任何資訊,客戶端繼續向伺服器傳送資料。伺服器重啟後由於失去了崩潰前所有連線資訊,所有伺服器tcp對所有來自客戶的資料分節響應rst,客戶收到rst後,阻塞的read呼叫返回econnreset錯誤。
11. 伺服器主機關機:會先發sigterm訊號,再發sigkill訊號。程序終止後與7描述的情況一樣。
12. 關於資料格式
注意三個潛在的問題:
解決以上問題的常用方法:
tcp 客戶 伺服器程式示例
1 client 從標準輸入讀入一行文字,並寫給伺服器。2 伺服器從網路輸入讀入這行文字,並回射給客戶。3 客戶從網路輸入讀入這行回射的文字,顯示在標準輸出上 標準輸入 fgets tcp 客戶 write read tcp 伺服器 標準輸出 fputs tcp 客戶 read write tcp ...
TCP客戶 伺服器程式例項
1.概述 這章的tcp客戶 伺服器模型 2.tcp回射伺服器程式 1 main函式 include unp.h int main int argc,char argv close connfd parent closes connected socket 2 str echo函式 include u...
TCP客戶 伺服器程式例項
server.cpp include include include include include include include include include include include include include define ip 127.0.0.1 define port 888...