//gcc server.c -o server -lpthread
#include
#include
#include
#include
#include
#include"stdlib.h"
#include
#include
#define MAXSIZE 2000 //宏声明并定义全局变量MAXSIZE 200
void *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 < j; i++) //for循环把buf写回与服务器相连的每一个的客户。
{
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 200
void *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 < 0 || n == 0)
{
perror("read"); //打印read函数的错误输出。
exit(1);
}
printf("%s", cbuf);
}
}
阅读(554) | 评论(0) | 转发(0) |