一、设计思路
我们已经学会了简单的socket编程和线程的概念,并在前期博客中完成了socket编程中服务器端将小写转为大写的实现,那么如果多个客户端同时连接服务器呢?并且每个客户端能够持续得到服务器的响应,又该如何实现呢?只需要再创建一个子线程,让子线程去读取客户端发送的数据,然后处理客户端的请求。
二、设计流程
在以前图一的基础上,创建子进程,将读取和处理数据交给子进程处理,由子进程转换得到图二

三、代码实现
void err(const char *str)
{
        perror(str);
        exit(1);
}
void *function(void *arg)
{
        int i;
        int ret;
        int cfd=*(int *)arg;
        //int ccfd=0;
        char buf[BUFSIZ];
        while(1)
        {
        ret=read(cfd,buf,sizeof(buf));
        //读取客户端发送的数据
        write(STDOUT_FILENO,buf,ret);
        for(i=0;i<ret;i++)
                buf[i]=toupper(buf[i]);
        //处理客户端发送的数据
        write(cfd,buf,ret);
        }
}
int main()
{
        pthread_t tid;
        int ret,i;
        int sfd=0;
        int cfd=0;
        char buf[BUFSIZ];
        struct sockaddr_in serv_addr,cli_addr;
        socklen_t cli_addr_len;
        serv_addr.sin_family=AF_INET;
        serv_addr.sin_port=htons(SERV_PORT);
        serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
        //初始化服务器地址结构
        sfd=socket(AF_INET,SOCK_STREAM,0);
        //创建一个socket,指定IPv4协议族
        if(sfd==-1)
        {
                err("socket error");
        }
        bind(sfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
        //绑定服务器的地址结构
        listen(sfd,128);
        //设置监听上限,此处不阻塞等待
        cli_addr_len=sizeof(cli_addr);
        //获取客户端地址结构的大小
        while(1)
        {
        cfd=accept(sfd,(struct sockaddr *)&cli_addr,&cli_addr_len);
        if(cfd==-1)
        {
                err("accept error");
        }
        int *fd=malloc(sizeof(int));//动态申请4个字节内存
        if(!fd)
        {
                perror("malloc");
                continue;
        }
        *fd=cfd;
        int mid=pthread_create(&tid,NULL,function,fd);//创建子进程
        if(mid!=0)
        {
                free(fd);
                err("pthread error");
        }
        }
        close(sfd);
        close(cfd);
        return 0;
}四、结果显示
客户端1


客户端2

客户端3

服务器











