![勤劳致富linux 勤劳致富linux]()
//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