TCP协议----客户端与客户端之间通信

服务器

#include
#include
#include
#include 
#include 
#include 
#include 
#include 

#define PORT 123

struct info     //定义结构体用于存放套接字的描述符,以及来自客户端发送的消息内容
{
    int num;
    char buf[100];
};

void *Recv(void *arg)
{
    pthread_detach(pthread_self());   //线程分离,确保资源的释放

    struct info Buff;
    int ret;

    while(1)
    {
        ret = recv(*(int *)arg,&Buff,sizeof(Buff),0);  //接收客户端的消息
        if(-1 == ret)
        {
            perror("recv");
            exit(1);
        }
        if(!strcmp(Buff.buf,"bye"))
        {
            close(*(int *)arg);
            break;
        }

        printf("Recv form client %d : %s\n",*(int *)arg,Buff.buf);


        ret = send(Buff.num,&Buff,sizeof(Buff),0);  //将消息发送给客户端
        if(-1 == ret)
        {
            perror("send");
            exit(1);
        }

        memset(&Buff,0,sizeof(Buff));
    }

}


int main()
{
    int sockfd,ret,fd[100] = {0};
    pthread_t tid[100] = {0};
    int i = 0;
    int length;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;

    printf("Start ....\n");
    sockfd = socket(PF_INET,SOCK_STREAM,0);   //创建socket
    if(-1 == sockfd)
    {
        perror("socket");
        exit(1);
    }

    int opt = 1;
    setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

    memset(&server_addr,0,sizeof(server_addr));
    server_addr.sin_family = PF_INET;
    server_addr.sin_port = PORT;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    printf("Binding ....\n");
    ret = bind(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr));  //将信息绑定到socket
    if(-1 == ret)
    {
        perror("bind");
        exit(1);
    }

    printf("Listening ...\n");
    ret = listen(sockfd,5);
    if(-1 == ret)
    {
        perror("listen");
        exit(1);
    }

    while(1)
    {
        length = sizeof(client_addr);
        fd[i] = accept(sockfd,(struct sockaddr*)&client_addr,&length);   //接收多个客户端的连接
        if(-1 == fd[i])
        {
            perror("accept");
            exit(1);
        }

        printf("Accept   %d,  Port   %d  \n",fd[i],server_addr.sin_port);

        ret = pthread_create(&tid[i],NULL,Recv,(void *)&fd[i]);  //为每个客户端创建线程,来处理来自每个客户端发送来的信息
        if(ret != 0)
        {
            perror("pthread_create");
            exit(1);
        }

        i++;
    }

    close(sockfd);
    return 0;

}
客户端


#include
#include
#include
#include 
#include 
#include 
#include 
#include 

pthread_t tid[2];
#define PORT 123

struct info
{
    int  num;
    char buf[100];
};

void *my_send(void *arg)
{
    struct info SendBuff = {0};
    int ret,oldtype;

    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,&oldtype);

    while(1)
    {
        scanf("%s  %d",SendBuff.buf,&SendBuff.num);

        ret = send(*(int *)arg,&SendBuff,sizeof(SendBuff),0);
        if(-1 == ret)
        {
            perror("send");
            exit(1);
        }
        if(!strcmp(SendBuff.buf,"bye"))
        {
            close(*(int *)arg);
            pthread_cancel(tid[1]);
            break;
        }
        memset(&SendBuff,0,sizeof(SendBuff));
    }

}

void *my_recv(void *arg)
{
    struct info RecvBuff = {0};
    int ret;

    while(1)
    {
        ret = recv(*(int *)arg,&RecvBuff,sizeof(RecvBuff),0);
        if(-1 == ret)
        {
            perror("recv");
            exit(1);
        }
        printf("\t\t %s \n",RecvBuff.buf);
        memset(&RecvBuff,0,sizeof(RecvBuff));
    }

}


int main()
{
    int sockfd,ret;

    struct sockaddr_in server_addr;

    sockfd = socket(PF_INET,SOCK_STREAM,0);
    if(-1 == sockfd)
    {
        perror("socket");
        exit(1);
    }

    memset(&server_addr,0,sizeof(server_addr));
    server_addr.sin_family = PF_INET;
    server_addr.sin_port = PORT;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    printf("Connecting ...\n");
    ret = connect(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr));
    if(-1 == ret)
    {
        perror("connect");
        exit(1);
    }

    ret = pthread_create(&tid[0],NULL,my_send,(void *)&sockfd);
    if(ret != 0)
    {
        perror("pthread_create");
        exit(1);
    }

    ret = pthread_create(&tid[1],NULL,my_recv,(void *)&sockfd);
    if(ret != 0)
    {
        perror("ptherad_create2");
        exit(1);
    }

    pthread_join(tid[0],NULL);
    pthread_join(tid[1],NULL);

    close(sockfd);

    return 0;
}


执行结果
服务器
    Start ....
    Binding ....
    Listening ...
    Accept   4,  Port   123  
    Accept   5,  Port   123  
    Recv form client 4 : hello
    Recv form client 5 : hello

客户端1
    Connecting ...
    hello 5
                     hello 
    bye

客户端2
    Connecting ...
                     hello 
    hello 4
    bye



你可能感兴趣的:(网络编程)