//gcc server.c -o server -lpthread#include #include #include #include #include #include"stdlib.h"#include #include #define MAXSIZE 2000  //宏声明并定义全局变量MAXSIZE 200void *doit1(void *);//声明指针函数void *doit2(void *);//声明指针函数char buf[100];int i=0, j;pthread_t tidA, tidB;pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;int main(){    int server_sockfd, client_sockfd;    int server_len, client_len;    struct sockaddr_in server_address;    struct sockaddr_in client_address;    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);    server_address.sin_family = AF_INET;    server_address.sin_addr.s_addr = inet_addr("127.0.0.1");    server_address.sin_port = htons(5000);    server_len = sizeof(server_address);    bind(server_sockfd, (struct sockaddr *) &server_address, server_len);//将所监听的端口号与服务器的地址、端口绑定。    listen(server_sockfd, 6);//listen()声明服务器处于监听状态,并且最多允许有6个客户端处于连接待状态。    while (1)    {        client_sockfd =            accept(server_sockfd, (struct sockaddr *) &client_address, &client_len); //接受客户端的连接请求,与客户端建立连接。                  if (client_sockfd >= 0)        {            pthread_create(&tidA, NULL, &doit1, &client_sockfd);//调用线程doit1,传递描述符。            pthread_create(&tidB, NULL, &doit2, &client_sockfd);//调用线程doit1,传递描述符。        }    }}void *doit1(void *vpr)          //doit1函数把函数参数类型转换后存入全局变量数组buf中。{    pthread_mutex_lock(&lock);    int counter;    counter = *((int *) vpr);   //函数参数类型转换    buf[i] = counter;        //把有数据请求的客户端的套接字描述符放置到buf[i]中最靠前的位置。    i++;    j = i;    pthread_mutex_unlock(&lock);    return NULL;}void *doit2(void *arg)      {    int n = 0;    char sbuf[MAXSIZE], cbuf[MAXSIZE];    int counter;    counter = *((int *) arg);    //函数参数类型转换    while (1)    {        n = read(counter, cbuf, MAXSIZE);    // 读入客户端的数据,若n等于0表示客户端已经关闭了连接。        if (n > 0)        {            printf("收到客户进程的信息:%s\n", cbuf);            strcpy(sbuf, "服务器进程收到信息:");            strcat(sbuf, cbuf);            pthread_mutex_lock(&lock);        for (i = 0; i             {                write(buf[i], sbuf, MAXSIZE);                    }        pthread_mutex_unlock(&lock);        }    }    return NULL;}//gcc client.c -o client -lpthread#include #include #include #include #include #include #include #include   #define MAXSIZE 200   //宏声明并定义全局变量MAXSIZE 200void *doit(void *);pthread_t tidA;int main(int argc, char *argv[]){    int sockfd;    int len;    struct sockaddr_in address;    char buf[MAXSIZE];    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)    {        perror("socket");        exit(1);    }    address.sin_family = AF_INET;    address.sin_addr.s_addr = inet_addr("127.0.0.1");    address.sin_port = htons(5000);    len = sizeof(address);    if (connect(sockfd, (struct sockaddr *) &address, len) == -1)    //与服务器建立链接。    {        perror("connect");        exit(1);    }    while (1)    {        fgets(buf, MAXSIZE, stdin);    //用fgets从键盘读数据到buf中。        write(sockfd, buf, MAXSIZE);    //把buf中的数据写给服务器。        printf("从服务器进程收到的信息:%s\n", buf);        pthread_create(&tidA, NULL,&doit, &sockfd);//调用doit线程函数。    }}void *doit(void *arg){    int n = 0;    char cbuf[MAXSIZE];    int counter;    counter = *((int *) arg);    //函数参数类型转换。    while (1)    {        n = read(counter, cbuf, MAXSIZE);     //把服务器上的数据读到cbuf中。        if (n         {            perror("read");    //打印read函数的错误输出。            exit(1);        }        printf("%s", cbuf);    }}
10-21 17:44