通過捕捉sigchld訊號捕捉殭屍程序,可解決多個子程序同時連線的情況
//伺服器端
#include #include #include #include #include #include #include #include #include void error_handling(char* message)
void handle_sigchld(int sig)
ssize_t readn(int fd,void* buf,size_t count)
}else if(nread==0) //對等方關閉
bufp+=nread;
nleft-=nread;
}return count;
} ssize_t written(int fd,const void* buf,size_t count)
}else if(nwritten==0)
continue;
bufp+=nwritten;
nleft-=nwritten;
}return count;
}ssize_t recv_peek(int sockfd,void* buf,size_t len)
}//因為readline()用recvpeek()封裝的,所以readline()只能用於套介面
ssize_t readline(int sockfd,void* buf,size_t maxline)
ssize_t readn(int fd,void* buf,size_t count)
}else if(nread==0) //對等方關閉
bufp+=nread;
nleft-=nread;
}return count;
} ssize_t written(int fd,const void* buf,size_t count)
}else if(nwritten==0)
continue;
bufp+=nwritten;
nleft-=nwritten;
}return count;
}ssize_t recv_peek(int sockfd,void* buf,size_t len)
}//因為readline()用recvpeek()封裝的,所以readline()只能用於套介面
ssize_t readline(int sockfd,void* buf,size_t maxline)
}nleft-=nread;
ret=readn(sockfd,bufp,nread);
if(ret<0)
error_handling("readline_readn");
bufp+=nread;
}return -1;
}
int main()
; char recvbuf[1024]=;
int n;
while(fgets(sendbuf,sizeof(sendbuf),stdin)!=null)
fputs(recvbuf,stdout);
memset(&sendbuf,0,sizeof(sendbuf));
memset(&sendbuf,0,sizeof(sendbuf));
}close(sock[i]);
}return 0;
}
Linux網路程式設計(五)
linux伺服器模型。udp伺服器通常採用迴圈伺服器模型,tcp伺服器通常採用併發伺服器模型 實現思路 伺服器建立偵聽socket,並建立子程序。所有子程序呼叫accept,無連線時將睡眠。有連線到來時所有子程序被喚醒。某乙個子程序接受連線後,其他程序繼續睡眠。乙個預先建立子程序的例子。create...
Linux網路程式設計學習筆記 索引
一 linux基本知識 學習筆記 linux平台的檔案i o操作 學習筆記 linux平台的檔案,目錄及操作 linux學習筆記 標準輸入輸出 linux學習筆記 程序概念及控制 linux學習筆記 訊號處理 二 程序間通訊 三 傳輸層協議tcp和udp 四 tcp套接字 五 udp資料報 六 套接...
linux網路程式設計筆記
以下是對我之前學習的linux網路程式設計的一些筆記。int socket int domain,int type,int protocol type這個引數,可以加上乙個 sock nonblock,把套接字設定為非阻塞,保證這一設定的原子性。int listen int sockfd,int b...