Chinaunix首页 | 论坛 | 博客
  • 博客访问: 136945
  • 博文数量: 69
  • 博客积分: 39
  • 博客等级: 民兵
  • 技术积分: 360
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 17:08
文章分类

全部博文(69)

文章存档

2012年(69)

分类:

2012-10-29 19:26:03

原文地址:cs 实现广播 作者:勤劳致富linux


//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);

    }

}
阅读(558) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~