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  

  

posted @ 2015-11-16 16:42  chunyi  阅读(357)  评论(0编辑  收藏  举报