多个客户端之间的通信

服务器

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

#define PORT   8888

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

void *MyReceive(void *arg)
{
    struct info Recvbuf = {0};
    int ret;

    pthread_detach(pthread_self());

    while(1)
    {
        ret = recv(*(int *)arg,&Recvbuf,sizeof(Recvbuf),0);
        if(-1 == ret)
        {
            perror("recv");
            exit(1);
        }
        if(!strcmp(Recvbuf.buf,"bye"))
        {
            close(*(int *)arg);
            break;
        }

        ret = send(Recvbuf.Tofd,&Recvbuf,sizeof(Recvbuf),0);
        if(-1==ret)
        {
            perror("send");
            exit(1);
        }
        memset(&Recvbuf, 0, sizeof(Recvbuf));
    }
}

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

    printf("Start Server!\n");
    sockfd = socket(PF_INET, SOCK_STREAM, 0);      
    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");       

    ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));   
    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], client_addr.sin_port);

        ret =pthread_create(&tid[i],NULL,MyReceive,(void *)&fd[i]);
        if(0 != ret)
        {
            perror("pthread_create");
            exit(1);
        }
        i++;
    }

    close(sockfd);

    return 0;
}

客户端

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

#define PORT    8888

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

pthread_t tid[2]={0};

void *Send(void *arg)
{
    struct info Sendbuf = {0};
    int ret;

    while (1)
    {
        scanf("%s%d", Sendbuf.buf,&Sendbuf.Tofd);

        ret = send(*(int *)arg,&Sendbuf, sizeof(Sendbuf), 0);     
        if (-1 == ret)
        {
            perror("send");
            exit(1);
        }

        if (!strcmp(Sendbuf.buf, "bye"))
        {
            close(*(int *)arg);
            pthread_cancel(tid[1]);
            break;
        }

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

void *Recv(void *arg)
{
    struct info Recvbuf = {0};
    int ret,oldtype;
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,&oldtype);

    while (1)
    {
        ret = recv(*(int *)arg,&Recvbuf, sizeof(Recvbuf), 0);      
        if (-1 == ret)
        {
            perror("recv");
            exit(1);
        }

        printf("\t\t\t%s\n",Recvbuf.buf);

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

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("Start 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,Send,(void *)&sockfd);
    if(0 != ret)
    {
        perror("pthread_create1");
        exit(1);
    }

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

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

    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值