Linux socke server程式設計:父程式和子程式關係
Linux socke server程式設計:父程式和子程式關係
測試過程中碰到的需要記錄的地方
1、父程式accept建立新socket後(比如socket為connect_fd),需要在父程式中關閉該connect_fd(即close(connect_fd)
)(父程式負責accept等待建立連線,每次產生新的連線交給子程式處理的情況下)
因為
:子程式是父程式的完全拷貝,所以只有父子兩個程式都關掉connect_fd,這個connect_fd才算關掉;如果父程式這裡沒有close(connect_fd),那就運算元程式close(connect_fd),實際socket connect_fd並沒有被關閉; 所以為了子程式完全控制connect_fd,父程式建立connect_fd後,直接close(connect_fd);
完整程式碼
下面展示 TCP server端程式碼
:
/* File Name: server.c */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<unistd.h>/*#包含<unistd.h> fork()等程式會用到*/
#include<arpa/inet.h>/**/
#include<sys/socket.h>
#include<netinet/in.h>
#define DEFAULT_PORT 40010
#define MAXLINE 4096
int main(int argc, char** argv)
{
int socket_fd, connect_fd;
struct sockaddr_in servaddr;
char buff[4096];
int n;
//初始化Socket
if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
//初始化
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址設定成INADDR_ANY,讓系統自動獲取本機的IP地址。
// printf("servaddr.sin_addr_cxf == %s\n",inet_ntoa((struct in_addr) servaddr.sin_addr));
servaddr.sin_port = htons(DEFAULT_PORT);//設定的埠為DEFAULT_PORT
//將本地地址繫結到所建立的套接字上
if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
//開始監聽是否有客戶端連線
if( listen(socket_fd, 10) == -1){
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
printf("======waiting for client's request======\n");
printf("main PID == %d\n",getpid());
while(1){
//阻塞直到有客戶端連線,不然多浪費CPU資源。
if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1){
printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
continue;
}
if(!fork())
{
printf("son PID == %d\n",getpid());
printf("connect_fd == %d\n",connect_fd);
if(send(connect_fd, "Hello,you are connected!\n", 26,0) == -1)
perror("send error");
while(1)
{
//接受客戶端傳過來的資料
if((n = recv(connect_fd, buff, MAXLINE, 0))== 0) //這裡要判斷recv接收到的是否為0,不然client主動斷開後,會導致一直列印"recv msg from client: %s,PID:%d \n"
{
printf("closed from client,connect_fd:%d\n",connect_fd);
close(connect_fd);
exit(0);
}
buff[n] = '\0';
printf("connect_fd:%d \n", connect_fd);
printf("recv msg from client: %s,PID:%d \n", buff,getpid());
}
}
close(connect_fd); //這裡是父程式的connect_fd,需要著重講下:父子程式都有這個connect_fd識別符號,只有父子兩個程式都關掉connect_fd,這個connect_fd才算關掉;如果父程式這裡沒有close(connect_fd),那就運算元程式close(connect_fd),實際socket connect_fd並沒有被關閉; 所以為了子程式完全控制connect_fd,父程式建立connect_fd後,直接close(connect_fd)
}
close(socket_fd);
}
注意點
1、fork()之後,建立新程式(即子程式),通過sudo netstat -antup
可以檢視原程式和新程式;
2、可以通過getpid()
獲取本程式的程式ID(即PID);
3、如果子程式結束,但是子程式的某些資源沒關掉的話,會導致程式被掛到父程式下面
比如子程式中沒有close(connect_fd),但是子程式呼叫了exit(0)關閉自己的執行緒,然後從sudo netstat -antup來看,子執行緒還在,只不過PID變成了父程式的PID
相關文章
- fork、父程式和子程式
- Linux程式關係Linux
- linux 子程式可以繼承父程式正在監聽的埠嗎? 如何子程式關閉了繼承的埠,父程式還能使用這個埠嗎?Linux繼承
- 物件導向程式設計程式碼詳解(依賴關係,關聯關係,組合關係)物件程式設計
- C++程式設計開發和指標的關係C++程式設計指標
- 非同步程式設計之Async,Await和ConfigureAwait的關係非同步程式設計AI
- 程式和產品的關係
- SQL 程式設計思想:一切皆關係SQL程式設計
- linux程式全解-3.4.linux應用程式設計和網路程式設計第4部分Linux程式設計
- Java 網路程式設計(TCP程式設計 和 UDP程式設計)Java程式設計TCPUDP
- 今天好程式設計師雲端計算教程分享雲端計算是什麼,和Linux什麼關係程式設計師Linux
- Django中ORM外來鍵和表的關係(Django程式設計-4)DjangoORM程式設計
- 【linux】系統程式設計-1-程式、管道和訊號Linux程式設計
- Linux系統程式設計 - 07. 迴圈建立N個子程式分析Linux程式設計
- Linux jpeg程式設計Linux程式設計
- Linux Bash程式設計Linux程式設計
- (整合)Linux下的多程式程式設計Linux程式設計
- 【Linux】關於Linux的系統程式設計總結Linux程式設計
- GitHub釋出重大更新,關係到所有程式設計師!Github程式設計師
- Linux系統程式設計——特殊程式之孤兒程式Linux程式設計
- 【Linux】 Linux網路程式設計Linux程式設計
- 《父與子的程式設計之旅(第3版)》第1章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第2章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第3章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第4章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第5章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第6章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第7章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第8章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第9章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第11章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第12章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第13章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第14章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第15章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第16章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第17章習題答案程式設計
- 《父與子的程式設計之旅(第3版)》第18章習題答案程式設計