并发服务端有多线程的和多进程的,今天来看一下多线程的。线程编程可能会麻烦一点,其中涉及到一些同步,死锁问题,但是也有其优点。并发服务端用的多的还是多进程。

服务端:

 

#include<stdlib.h>
#include<pthread.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<stdio.h>
#include<iostream>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>


void *server_handle(void * sock_fd);

int main()
{   
    int sockSrv;
    int sockConn;
    struct sockaddr_in addrSrv;
    struct sockaddr_in addrClient;
    socklen_t client_length;
    
    sockSrv = socket(AF_INET,SOCK_STREAM,0);
    
    
    memset(&addrSrv,0,sizeof(addrSrv));
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_addr.s_addr = htonl(INADDR_ANY);
    addrSrv.sin_port = htons(8888);          
    bind(sockSrv,(const struct sockaddr *)(&addrSrv),sizeof(struct sockaddr_in));
    
    listen(sockSrv,5);
    
    while(1)
    {   
        pthread_t thread_id;
        client_length = sizeof(addrClient);
        
        sockConn = accept(sockSrv,(struct sockaddr *)(&addrClient),&client_length);
        
        if(pthread_create(&thread_id,NULL,server_handle,(void *)(&sockConn)) == -1)//创建线程
        {   
            printf("pthread_create error!\n");
            break;
        }
    }
    
    
    close(sockSrv);
    return 0;
}

void *server_handle(void * sock_fd)
{
    int fd = *(int *)sock_fd;
    int  recvBytes = 0;
    char recvBuf[1024];
    char sendBuf[50] = "Server has received your request!\n";

    while(1)
    {
        memset(recvBuf,0,1024);

        recvBytes = read(fd,recvBuf,1024);
        printf("recvDate=%s\n",recvBuf);

        if(recvBytes == 0)
        {
            printf("client closed\n");
            break;
        }
        if(recvBytes == -1)
        {
            printf("read error!\n");
            break;
        }

        if(write(fd,sendBuf,strlen(sendBuf)) == -1)
        {
            break;
        }
    }

    close(fd);
    pthread_exit(NULL);//线程退出   
}

客户端:

 

 

#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main()
{
    int sockClient = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in addrSrv;
    addrSrv.sin_addr.s_addr = inet_addr("127.0.0.1");
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(8888);
    connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));

    char sendBuf[100] = "123";
    char recvBuf[100];

    send(sockClient, sendBuf, strlen(sendBuf)+1, 0);
    printf("%s\n", sendBuf);

    recv(sockClient,recvBuf,sizeof(recvBuf),0);
    printf("recvBuf=%s\n",recvBuf);

    getchar();
    close(sockClient);

    return 0;
}

 

经过编译,能运行。

 

 

[mapan@localhost threadServer]$ ./server 
recvDate=123

[mapan@localhost threadServer]$ ./client 
123
recvBuf=Server has received your request!

 

 

 

 

 

 

参考地址:https://www.cnblogs.com/nerohwang/p/3602233.html

多进程版本参看:http://blog.csdn.net/stpeace/article/details/75947203