TCP多进程并发服务端 Linux socket编程入门(2)
这里很简单的使用了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()); //打印PID
process_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

浙公网安备 33010602011771号