首先回憶一下在tcp程式設計中,主要看一下伺服器端的**
#include #include #include #include #include #include #include #include // ip位址轉換函式
#include // 位元組序轉換函式
int main()
; int n = recv(c, buff, 2, 0); // 阻塞 有資料可讀或者客戶端退出都會返回
if(n == 0)
else if(n == -1)
printf("n == %d: %s\n", n, buff);
send(c, "ok", 2, 0); }}
close(listenfd);
在這個中,我們可以看到以下問題:
(1)tcp伺服器一次只能與乙個客戶端通訊
(2)如果伺服器端的邏輯處理很複雜 ,則與乙個客戶端通訊也會存在效率問題。客戶端一次請求可能需要的處理事件較長,則客戶端必須等待伺服器處理
在多執行緒中,主線程用來接收鏈結
函式執行緒與乙個客戶端進行互動過程
一、多程序下面是伺服器端的**:
#include #include #include #include #include #include #include #include #include #include void childdealclient(int c, struct sockaddr_in cli)
; int n = recv(c, data, 127, 0);
if(n <= 0)
printf("%s:%d :: %s\n", inet_ntoa(cli.sin_addr), ntohs(cli.sin_port),
data);
send(c, "ok", 2, 0);
}printf("one client unlink\n");
}int main()
else
}
2、多程序存在的缺陷:
(1)建立乙個程序,為乙個客戶端互動完成後,也會隨之結束,有時候客戶端鏈結上,什麼也不做又會斷開,因此會造成伺服器系統負擔
(2)如果客戶端很多,則伺服器建立的子程序也會很多,並且大部分子程序會阻塞在recv操作
二、多執行緒
1、需要注意的問題
(1)c需要通過執行緒建立函式以值傳遞的方式傳遞給函式執行緒
(2)close(c)只能是函式程序結束服務後呼叫,主線程不能呼叫
下面是**:
#include #include#include#include#include #include#include #include #include#include void* commclient(void *data)
; int n = recv(c,recvbuf,strlen(recvbuf)-1,0);
if(n <= 0||strncmp(recvbuf,"end",3) == 0)
printf("%d:%s", c,recvbuf);
send(c,"ok",2,0);
} close(c);
}int main(int argc, char const *ar**)
pthread_t id;
int res = pthread_create(&id,null,commclient,(void *)c);//void * c send accept-> c
assert(res == 0); }
close(sockfd);
}
2、存在的缺陷
(1)系統能夠建立的程序或者乙個程序能夠建立的執行緒是有限的
(2)為乙個客戶端鏈結建立乙個程序或者執行緒,客戶端斷開則銷毀是不划算的
TCP併發伺服器多程序程式設計
環境 linux c 功能 併發伺服器實現cs通訊 server.c include include include include include include 檔案io read write close fork waitpid include socket struct sockaddr i...
linux 網路程式設計 多程序TCP伺服器
include include include include include include include include include include include in.h include arpa inet.h include ctype.h int main int argc,cha...
TCP多程序併發伺服器 c
其他關聯文章 丶4ut15m tcp網路程式設計 c udp網路程式設計 c 多執行緒併發伺服器 c io復用 c 多程序併發伺服器整個流程和單程序差別不太大,主要區別在互動部分.伺服器 建立套接字 繫結位址結構 監聽套接字 等待並接受連線請求 主程序建立子程序後執行上一步,子程序與客戶端進行互動 ...