当前位置:  技术问答>linux和unix

哪位大哥能给个linux下线程通讯的例子吗????

    来源: 互联网  发布时间:2015-08-26

    本文导语:  谢谢了! | 服务器端: #include "header.h" #define TRUE       1 #define FALSE      0 #define MAX_SOCKETFD_NUM  5 int s_sockfd,network_flag; unsigned int CreateSocket() {     struct sockaddr_in server_addr;    ...

谢谢了!

|
服务器端:
#include "header.h"

#define TRUE       1
#define FALSE      0
#define MAX_SOCKETFD_NUM  5

int s_sockfd,network_flag;

unsigned int CreateSocket()
{
    struct sockaddr_in server_addr;
    int n;
    
    if ((s_sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        printf("Socket error:%sn",strerror(errno));
        return FALSE;
    }
    
    memset(&server_addr, 0,sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(4000);
    server_addr.sin_addr.s_addr = inet_addr("10.8.4.88");
     
     n=1;
     /*如果服务器终止后,服务器可以第二次快速启动而不用等待一段时间 */
     setsockopt(s_sockfd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int)); 
    
    if (bind(s_sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
    {
        printf("Bind error:%sn",strerror(errno));
        return FALSE;
    }
    else
        printf("Bind ok.n");
    
    if (listen(s_sockfd,5)==-1)
    {
        printf("Listen error:%sn",strerror(errno));
        return FALSE;
    }
    else
        printf("Listen ok.n");
    return TRUE;
}

void *NetThread(void *arg)
{
    int *retval;
    unsigned int fd,nread,nwrite,count;
    unsigned char buffer[1024],w_buffer[256];
    struct timeval start_tv,end_tv;
    struct timezone start_tz,end_tz;
    
    count = 0;
    #ifdef SEND_VALUE
        fd = *((int *)arg);
    #else
        fd = (unsigned int)arg;
    #endif
    gettimeofday(&start_tv,&start_tz);
    
    while (1)
    {
        nread = 0;
        memset(buffer,0,sizeof(buffer));
        memset(w_buffer,0,sizeof(w_buffer));
        
        nread = read(fd,buffer,1024);
        if (nread > 0)
        {
            count++;
            //printf("Server receive:%sn",buffer);
        }
        
        gettimeofday(&end_tv,&end_tz);
        if ((end_tv.tv_sec-start_tv.tv_sec) >= 1)
        {
            gettimeofday(&start_tv,&start_tz);
            memcpy(w_buffer,"test",4);
            if ((nwrite = write(fd,w_buffer,sizeof(w_buffer)))==-1)
            {
                printf("Write error:%sn",strerror(errno));
                break;
            }
            printf("server %d receive data number:%dn",pthread_self(),count);
            count = 0;
        }
        
        usleep(1000);
    }
    pthread_exit(&retval);
}

void NetServer()
{
unsigned int retval;
    struct sockaddr_in client_addr;
    socklen_t sin_size;
    unsigned char client_ip[16];
    #ifdef SEND_VALUE
    unsigned int *new_fd;
    #else
    unsigned int new_fd;
    #endif
    pthread_t net_thread;
    
    while (1)
    {
        sin_size = sizeof(struct sockaddr_in);
        
        #ifdef SEND_VALUE
            if ((*new_fd = accept(s_sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
        #else
            if ((new_fd = accept(s_sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
        #endif
        {
            printf("Accept error:%sn",strerror(errno));
            break;
        }
        else
        {
            strcpy(client_ip,inet_ntoa(client_addr.sin_addr));
            printf("Server get connection from:%sn",client_ip);
            
            /* Create process net data thread
              * 为线程传递更具移植性参数(即:将整数值传给被调用函数,值的拷贝被推入被调用函数的栈中)
              * 传递指针参数时,多个线程同时存取一个共享变量(new_fd)而没有同步措施
              */
            #ifdef SEND_VALUE
                if (pthread_create(&net_thread,NULL,NetThread,new_fd)!=0)
            #else
                /* 传递指针参数*/
                if (pthread_create(&net_thread,NULL,NetThread,(void *)new_fd)!=0)
            #endif
            {
                printf("Create server thread failed.n");
            }
            else printf("Thread server created!n");
        }
        
        usleep(10000);
    }
}

void CheckConnect()
{
network_flag = 0;
}

int main()
{
    int ret;
    
    signal(SIGPIPE,CheckConnect);
    
    ret = CreateSocket();
    if (ret == FALSE)
    {
        printf("Create socket faile.n");
        return FALSE;
    }
    
    NetServer();
    
    usleep(10000);
    return 0;
}


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 大哥、大哥,你好吗?
  • 过河小兵,求救各位大哥,我想把stl中的map,vector等容器,做成内存共享方式,希望大哥大姐们指点一下
  • 请教各位大哥!!!
  • 各位大哥帮忙啊!
  • 请各位大哥告知JAVA中消息机制的有关资料,拜托!
  • 想学qt,大哥大姐前辈们介绍几本书吧,最好能提供电子版,谢谢~~~~~~~~~~~
  • 各位前辈大哥,大家好。可否帮忙?
  • 那位大哥有Solaris下安装配置cvs的具体步骤,我先谢了!!!!
  • 哪位大哥知道linux下怎么设置刷新率呀?我的眼睛快闪怀了:(
  • 不知那位大哥有 Optimizeit 4.2 的破解包。高分求购
  • 哪位大哥,大姐知道国内那个网站有jdk1.4的API下载,告诉小弟一下
  • 各位大哥请帮忙!!
  • 哪位大哥知道浙大兰德怎么样?面试会试些什么呀?
  • 哪位大哥知道杭州CSK公司怎么样?面试会试些什么呀? 薪水大概多少?急!!谢谢!!
  • 哪位大哥有www server方面的源码(c++)在linux上面运行,小弟300分求!!
  • 如何通过telnet登陆FreeBSD,哪位大哥给出详细说明
  • 怎样才能启动我的linux,请大哥赐教!
  • 提个菜鸟问题,哪位大哥帮帮我。
  • 哪位大哥帮帮我,安装时的超级终端问题。
  • unix网络编程资料帮忙 大哥大姐进来瞧瞧啊


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3