這里很簡單的使用了fork()函數,在執行了fork()以后的所有代碼都會由子進程和父進程同時執行。
他們同時擁有相同的資源(兩份拷貝),所以在子進程執行的過程中,子進程需要先close掉listenfd(監聽套接字),以免過多占用系統資源。
而父進程繼續監聽listenfd,如果有新的連接出現,則會再次添加一個子進程。
這個tcp服務端的功能也是十分簡單,就是將客戶端的消息,原封不動地發回去。
?
代碼如下
#include "socket_includes.h"int create_socket();
int process_data(int sockfd);int main(int argc,char **argv)
{ struct sockaddr_in cliaddr;int sockfd, listenfd;int cli_addr_len;printf("My pid is %d\n",getpid());listenfd = create_socket();if(listenfd < 0){printf("create_socket err\n");return -1;}for(;;){cli_addr_len = sizeof(cliaddr);sockfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cli_addr_len);if(sockfd < 0){printf("accept err:\n");continue;}if(fork() == 0){//就是這里!新建了一個子進程。close(listenfd);//子進程關閉不要用的套接字。父進程沒有關閉,他們是兩套拷貝printf("My pid is %d\n",getpid()); //打印PIDprocess_data(sockfd); //數據處理的過程我用函數打包了一下exit(0);}close(sockfd); //子進程和父進程都會關閉sockfd}close(listenfd);return 0;
} int process_data(int sockfd){int bytes, err;char buff[MAX_BUFF_LINE];printf("產生了一個新的客戶連接\n");for(;;){bytes = recv(sockfd,buff, MAX_BUFF_LINE, 0);if(bytes < 0){printf("recv err:\n");continue;}buff[bytes] = '\0';if(!strcmp(buff, "q")){printf("客戶連接退出了!\n");err = send(sockfd, "quit!\n", strlen("quit!\n"), 0);close(sockfd);exit(0); }printf("%s", buff); err = send(sockfd, buff, bytes, 0);if(err < 0){printf("send err:\n");continue;}}
}int create_socket(){int listenfd, err;int ser_addr_len;struct sockaddr_in servaddr;listenfd = socket(AF_INET, SOCK_STREAM, 0);if(listenfd < 0){printf("socket err:");return -1; }//清零IP地址結構體bzero(&servaddr, sizeof(servaddr));//填寫必要的信息servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(PORT);ser_addr_len = sizeof(servaddr);err = bind(listenfd, (struct sockaddr *)&servaddr, ser_addr_len);if(err < 0){printf("bind err:");return -1;}err = listen(listenfd, 10);if(err < 0){printf("listen err:");return -1; }printf("listen the port:%d\n", PORT); return listenfd;
}
? 頭文件"socket_includes.h"的內容是:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include <errno.h> #define MAX_BUFF_LINE 100
#define PORT 9999