使用fork创建进程,使用wait等待子进程处理。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <string.h>
#include <pthread.h>
#define SERVER_POST 666
int main(void)
{
/************************** 服务器监听初始化 *********************************/
struct sockaddr_in server_addr; //定义socket结构
int sock = socket(AF_INET, SOCK_STREAM, 0); //创建一个套接字端口--文件.用于本地监听
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET; //选择协议族ipv4
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //设为0,监听本地所有ip地址
server_addr.sin_port = htons(SERVER_POST); //设置端口号
bind(sock, (struct sockaddr*)&server_addr, sizeof server_addr); //使监听的地址和端口地址 与 缓存区端口绑定
listen(sock, 128); //启动本地端口监听
/************************* 通信部分 *******************************/
int done = 1;
int isWait = 1; //判断是否等待
while(done) {
if (isWait) {
printf("father : 等待客户端的链接....\n");
isWait = 0;
}
struct sockaddr_in client_addr; //定义客户端socket结构
char client_ip[64]; //客户端ip缓存区
socklen_t client_addr_len = sizeof client_addr;
int client_sock_t = accept(sock, (struct sockaddr*)&client_addr, &client_addr_len); //创建通信缓存区端口--文件描述符
//if (client_sock == -1) continue;
//打印客户端ip地址和端口号
printf("client ip: %s\t port: %d\n", inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, sizeof client_ip),
ntohs(client_addr.sin_port));
int pid=fork();
if(pid<0){
fprintf(stderr,"father :fork failed.\n");
exit(1);
}
else if(pid==0){
//读取客户端发送来的数据
int client_sock = client_sock_t; //子进程初始化参数
char buf[256]; //通信内容处理缓存区
int len = read(client_sock, buf, sizeof(buf) - 1); //开始读取数据
buf[len] = '\0';
printf("child pid[%d] receive[%d]: %s\n ",getpid(), len, buf);
//数据处理
int i;
for(i=0;i<len;i++) {
if (buf[i] >= 'a' && buf[i] <= 'z') buf[i] -= 32;
//buf[i] = toupper(buf[i]);
}
len = write(client_sock, buf, len); //写回数据
printf("child pid[%d] finished_len:%d\n", getpid(),len);
close(client_sock); //关闭通信缓存区
}
else {
isWait = 1; //设置等待提示
}
}
close(sock); //关闭本地监听端口
return 0;
}