多个客户端之间的通信

来源:互联网 发布:怎么看本机端口号 编辑:程序博客网 时间:2024/05/20 00:17

服务器

#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   8888struct 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    8888struct 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 0
原创粉丝点击