TCP多程序併發伺服器 c

2021-10-01 10:57:32 字數 4234 閱讀 9830

其他關聯文章@丶4ut15m:

tcp網路程式設計(c)

udp網路程式設計(c)

多執行緒併發伺服器(c)

io復用(c)

多程序併發伺服器整個流程和單程序差別不太大,主要區別在互動部分.

伺服器->建立套接字

->繫結位址結構

->監聽套接字

->等待並接受連線請求

->主程序建立子程序後執行上一步,子程序與客戶端進行互動

->關閉套接字

父程序和子程序都會執行fork(建立子程序)後面的**,為了區別父程序和子程序通過使用if語句和pid來控制想要父程序和子程序分別執行的**.

詳細內容見我的作業三和**

下面給個例項

伺服器:

伺服器等待接收客戶的連線請求,連線成功則顯示客戶位址;

接收客戶端的名稱並顯示;

然後接收來自該客戶的字串,對接收的字串按分組進行加密(分組長度為個人學號,金鑰為個人序號,分組不夠補0);

將加密後的字串傳送給客戶端;

繼續等待接收該客戶的資訊,直到客戶關閉連線;

要求伺服器具有同時處理多個客戶請求的能力。

客戶端:

客戶首先與相應的伺服器建立連線;

接著接收使用者輸入的客戶端名稱,並將其傳送給伺服器;

接收使用者輸入的字串並傳送給伺服器;

接收伺服器發回的加密後的字串並顯示。

繼續等待使用者輸入字串;

若使用者輸入的是quit,則關閉連線並退出。

使用多程序實現

伺服器**如下

#include //基本輸入輸出

#include //exit函式所在標頭檔案

#include //套接字函式所在標頭檔案

#include //memset函式所在標頭檔案

#include //inet_ntoa函式所在標頭檔案

#include //close等函式所在標頭檔案

#define port 3333

char miwen[100]; //定義全域性變數,用以存放密文

int response(int connectfd,struct sockaddr_in client);

void encode(char data,int snum);

int main();

char data[100];

pid_t chld_pid; //存放子程序pid

struct sockaddr_in server,client; //定義位址結構

socklen_t clientlen;

if((listenfd = socket(af_inet,sock_stream,0)) == -1)

//位址重用

int opt = so_reuseaddr;

setsockopt(listenfd,sol_socket,so_reuseaddr,&opt,sizeof(opt));

//bind操作前的預處理

memset(&server,'\0',sizeof(server));

server.sin_family = af_inet; //配置協議族為ipv4

server.sin_port = htons(port); //配置埠

server.sin_addr.s_addr = htonl(inaddr_any); //設定監聽位址

if(bind(listenfd,(struct sockaddr *)&server,sizeof(server)) == -1)

if(listen(listenfd,5) == -1)

while(1)

printf("got a connect from %s:%d\n",inet_ntoa(client.sin_addr),htons(client.sin_port));

//呼叫響應函式

response(connectfd,client); //接收使用者輸入的名字並列印

/**fork會分別給父程序和子程序返回乙個值

*對父程序會返回子程序的pid(乙個大於0的整數)

*對子程序會返回0

*所以可以通過if判斷pid的值來分辨子程序與父程序

*/chld_pid = fork(); //建立子程序

if(chld_pid == 0)

memset(&miwen,'\0',sizeof(miwen));

encode(data,miyao);

send(connectfd,miwen,strlen(miwen),0);

}close(connectfd);

exit(0); //處理完事件之後關閉子程序,記得上方注釋所說的關閉已連線套接字connectfd

} else if(chld_pid > 0)

else

} close(listenfd);

return 0;

}//定義響應函式用以列印客戶端名稱

int response(int connectfd,struct sockaddr_in client)

client_name[num-1] ='\0'; //將最後乙個字元置為空字元,用以作為字串結尾

printf("client name is %s\n",client_name);

return 0;

}//根據學號進行字串加密

void encode(char data,int snum)

else if(((data[i]+snum[j])>'z') && (data[i] >= 'a') && (data[i] <= 'z'))

else

//每次加密結束,j增加移至下乙個金鑰

j++;

if(j %10 == 0)

} }

if(strlen(data) % 10 != 0)

} }}

客戶端**如下

#include //基本輸入輸出

#include //sockaddr_in結構體所在標頭檔案

#include //socket函式所在標頭檔案

#include //hostent結構體所在標頭檔案

#include //memset等函式所在標頭檔案

#include //close等函式所在標頭檔案

#include //exit等函式所在標頭檔案

#define port 3333

int main(int argc,char *args)

//建立套接字

if((sockfd = socket(af_inet,sock_stream,0)) == -1)

//獲取伺服器資訊

if((he = gethostbyname(args[1])) == null)

memset(&server,'\0',sizeof(server));

//配置伺服器位址結構

server.sin_family = af_inet; //配置協議族為ipv4

server.sin_port = htons(port); //配置伺服器端口

server.sin_addr = *((struct in_addr *)he->h_addr); //伺服器位址

server_len = sizeof(server);

//而後可以進行連線

if((connect(sockfd,(struct sockaddr *)&server,sizeof(server))) ==-1)

printf("plz enter your name:");

memset(&data,'\0',sizeof(data)); //每次輸入資訊前先清空快取,防止前次資料影響後面輸入的資料

scanf("%s",&data);

if(send(sockfd,data,strlen(data),0) ==-1)

//連線之後便可開始資料的傳送與接收

while(1)

else

printf("the code message:%s\n",data); }}

printf("bye~\n");

close(sockfd);

}

TCP併發伺服器多程序程式設計

環境 linux c 功能 併發伺服器實現cs通訊 server.c include include include include include include 檔案io read write close fork waitpid include socket struct sockaddr i...

C語言使用多程序實現高併發tcp伺服器

socket 建立監聽套接字 bind 繫結位址結構 listen 設定監聽上限 accept 進行迴圈監聽 fork 接收到客戶端請求建立新的程序 close 與客戶端通訊的套接字關閉 include include include include include include void per...

併發伺服器 多程序實現

通過簡單的socket可以實現一對一的c s通訊,當多個客戶端同時進行伺服器訪問,那麼伺服器只能按序的一一進行處理,除了第乙個客戶端,其餘客戶端都會陷入等待。並且這樣的程式只能實現半雙工通訊 資料能雙向傳輸,但同一時刻只能單向傳遞,通過切換傳輸方向實現雙工 而且實現方式繁瑣,功能拘束,實用價值很低。...