TCP客戶 伺服器程式示例

2021-09-06 08:09:24 字數 3576 閱讀 8654

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 #include 

#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);}}

2. 示例啟動過程

客戶端伺服器建立連線後發生的動作:

所以至此有三個阻塞程序:客戶程序,伺服器父程序,伺服器子程序。

3. 示例正常終止過程

4. posix訊號處理(處理3產生的僵死程序)

訊號由乙個程序發給另乙個程序(或自身),也可由核心發給某個程序。

1)呼叫函式sigaction設定乙個訊號的處理有以下三種選擇:

2)signal函式(使用系統提供的)

#include typedef 

void (*sighandler_t)(int

);sighandler_t signal(

int signum, sighandler_t handler);

3)處理sigchld訊號(處理僵死程序)

4)例子

signal(sigchld, sig_child);

void sig_chld(int

signo)

5)處理被中斷的系統呼叫

for

( ; ; )

else}}

5. wait和waitpid

#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...