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

socket中server端多线程的问题

    来源: 互联网  发布时间:2016-09-18

    本文导语:  #include #include #include #include #include #include #include #include #include #define MYPORT 3490  #define BACKLOG 10   #define MAXDATASIZE 100 void  *doClientThead(void *pParam) {     char buf[MAXDATASIZE];     int cilentSocket=(int)pParam;     int numbytes;    ...

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MYPORT 3490 
#define BACKLOG 10  
#define MAXDATASIZE 100
void  *doClientThead(void *pParam)
{

    char buf[MAXDATASIZE];
    int cilentSocket=(int)pParam;
    int numbytes;
    while(1)
{

    if ((numbytes=recv(cilentSocket , buf, MAXDATASIZE, 0)) == -1) {
            perror("接收信息错误");
            break;
        }   
        if(numbytes==0)
        {
            printf("客户端退出n");
             break;
        }
        buf[numbytes] = '';
            printf("收到来自客户端的信息: %sn",cilentSocket,buf);
    }
    close(cilentSocket);
    printf("客户端 socket 已正常关闭!n");
    close(cilentSocket);
}

main()
{
    int sockfd, new_fd;
    struct sockaddr_in my_addr; 
    struct sockaddr_in their_addr;
    int sin_size;
    int numbytes;
    pthread_t pt;
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket创建失败");
        exit(1);
    }
    my_addr.sin_family = AF_INET;    
    my_addr.sin_port = htons(MYPORT);  
    my_addr.sin_addr.s_addr = INADDR_ANY;
    bzero(&(my_addr.sin_zero), 8);   
    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
    perror("绑定端口失败");
    exit(1);
    }
    if (listen(sockfd, BACKLOG) == -1) {
        perror("监听端口失败");
        exit(1);
    }
    printf("服务器已经开始监听3490端口!n");
    while(1) {
        sin_size = sizeof(struct sockaddr_in);
        if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {
            perror("接收信息错误");
            continue;
        }
        printf("服务器已取得得来自客户端 %s的连接!n", inet_ntoa(their_addr.sin_addr));

        if (send(new_fd, "连接成功n", 12, 0) == -1){
            perror("发送连接信息失败");
            continue;
        }

    //创建客户端进程
        if(pthread_create(&pt,NULL,doClientThead,(void *)new_fd)!=0){//就是在这个地方的疑问
            printf("客户端创建线程失败!n",new_fd);
            exit(1);
        }

    }


多线程问题,我的实际情况是需要多台client同时连一台server,在server端每accept到一个client的请求就新开一个线程。代码如上,这其实是网络上搜到的代码,我的疑问在创建线程的地方。线程不同于进程,thread不是fork,所以我的理解是这里有多线程共享内存的问题,简单说,如上代码,每个线程进去执行doClientThead这个函数的时候会不会有冲突的可能,从变量上看,doClientThead里面如果没有静态没有全局就是可重入的,可重入的函数应该就不用考虑这样的问题,但是比如说recv这个或者别的什么有没有可能存在这样冲突的可能性?

|
这个地方有什么疑问么?

为了一个server处理多client,接收到请求之后,创建一个线程,让这个线程去处理新来的client,然后server

继续他的工作。

你的问题在于线程handler的问题。

严格意义上来说,printf其实都属于不可重入的函数。

除开这个,其他的基本都是可以重入的。

    
 
 

您可能感兴趣的文章:

  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • 如果两个线程操作同一个Socket,一个线程recv,另一个send。这样会不会导致程序莫名其妙的退出
  • 多线程socket申请有无可能产生冲突?
  • socket 多线程编程
  • 多线程和socket结合
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • socket实现多文件并发传输,求助多线程实现问题?
  • 请问关于多线程SOCKET的问题
  • 多线程socket程序莫名其妙接收到SIGALRM信号问题。
  • 多线程中socket的问题
  • socket read阻塞:一个线程关闭另一个线程错误
  • 请问关于socket客户端因事件启动新线程的问题.高手请进
  • 一个关于socket线程池问题
  • 多线程close() socket套接字的问题
  • socket+多进程+多线程
  • 请问可以在一个Servlet里使用多线程和SOCKET吗?
  • 关于linux下多线程socket通讯的问题
  • Unix domain socket可用于同一个进程中的不同线程么?
  • 多余SOCKET服务器来说,用哪种线程安全锁性能最高?
  • socket通讯时如何为线程池分配Recv任务?
  • java命名空间javax.management.remote.rmi类rmiconnectorserver的类成员方法: rmi_server_socket_factory_attribute定义及介绍
  • Linux socket close后重新启动server的问题
  • Linux c socket编程:简单的客户端(client)和服务端(server)实现
  • socket中server是如何向多个client发送消息的?
  • 关于qt上的socket作server!
  • linux下socket编程 server端的问题
  • linux下的一个socket可以先后连续连接不同的server吗?
  • *****************用java写socket server的经典问题?*****************
  • Could not connect socket to the Merchant Payment Server
  • c/c++ iis7站长之家
  • socket实现Client 与 Server 的通信?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: gettrafficclass定义及介绍
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • java命名空间java.net类socket的类成员方法: getport定义及介绍
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • java命名空间java.net类socket的类成员方法: getlocalport定义及介绍
  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?
  • java命名空间java.net类socket的类成员方法: getinetaddress定义及介绍
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!
  • java命名空间java.net类socket的类成员方法: isconnected定义及介绍
  • 我的ping程序怎么老是出现Socket operation on non-socket


  • 站内导航:


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

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

    浙ICP备11055608号-3