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

多线程socket服务器端的问题!急!

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

    本文导语:  要实现手机和pc之间的通信,可以同时多个手机客户端进行连接通信,但是现在碰到一个问题,第一个客户端连接上后,再用第2个手机进行连接,第1个手机就会超时关闭,这样根本就没有实现多线程功能,请教大家看看代码,帮...

要实现手机和pc之间的通信,可以同时多个手机客户端进行连接通信,但是现在碰到一个问题,第一个客户端连接上后,再用第2个手机进行连接,第1个手机就会超时关闭,这样根本就没有实现多线程功能,请教大家看看代码,帮我解决下这个问题,最好能帮我修改下,谢谢!

#include   
#include   
#include 
#include   
#include 
#include   
#include   
#include 
#include 
#include 
#include 
#include 
#include   
#include   

#define REQUEST_NUM  10
#define MAX_CONNECTED_NUM 10
#define MAX_DATE_SIZE 1024

void *server_thread (void *fd)
{
   char revbuf[MAX_DATE_SIZE];
   char sendbuf[MAX_DATE_SIZE];
   struct sockaddr_rc addr_client;
   int len_addr=sizeof(addr_client);
   int sockfd = (int) fd;
   int error;
   int sendbytes;

   if ((error = pthread_detach (pthread_self ())) != 0)
   {
     close (sockfd);
     perror ("Can't detach server thread.");
     pthread_exit ((void*)1);
   }
   printf("the server thread ID is:%lun",pthread_self());
   getsockname(sockfd, (struct sockaddr *)&addr_client, &len_addr);

   while(1)
   {
     memset (revbuf, 0, sizeof(revbuf));
    if ((error = recv (sockfd, revbuf, sizeof(revbuf), MSG_NOSIGNAL)) 0)
       {
        if(FD_ISSET(listenfd,&readfd)>0)
          {
            if ((connectfd =accept (listenfd, (struct sockaddr *) &addr_client, &len_addr)) == -1)
            {
               perror ("connect error:");
               printf("exit!n");
               exit(1);
            }
            memset(temp,0,sizeof(temp));
            ba2str(&addr_client.rc_bdaddr,temp);
            printf("accept conenction from: %sn",temp);
            pthread_create (&tid, NULL, server_thread, (void *) connectfd);

          }
         }
  
   }
   close (listenfd);
  fprintf (stderr, "just a test,wish success!n");
  return 0;
}


|

  int sockfd = (int) fd; 

你的程序可以工作? 这一句都不对吧。笔误?

|
你的程序可能可以工作,但是这样写是非常不好的,给pthread_create()传入的数据参数是指针类型!建议修改如下几处看看:

1. pthread_create (&tid, NULL, server_thread, (void *) &connectfd); 

2. int sockfd = *(int*)fd; 

good luck!

|
当recv 的结果==0的时候,是手机端主动发出连接,线程里要调用close,当recv == -1的时候,检查一下系统的errno,如果errno==EINTR,继续执行recv,errno!=EINTR的时候,线程主动close掉..

当recv==-1,且errno==EINTR的时候,由信号中断引起返回,并非客户端断开连接了,要区别对待,继续执行recv

|

如guosha 所言!但是有一点更正下:
select最后一个timeout参数: (struct timeval *)0 应该是表示NULL,也就是所select在不可用用的时候是block的,而不是空循环。

只有当timevale->tv_sec = 0; timevale->tv_usec=0的时候,select才会立马返回,类似polling

good luck!


|
只有 一个 套接字 需要读,没必要用select

|
最主要的问题是 同一进程中的线程是共享内存对象的,你的客户端地址对象只定义了一个,下一个连接来的时候就被后一个客户端连接冲掉了

应该如下定义
struct sockaddr_rc addr_server, *addr_client; 

在select 成功后new 一个sockaddr_rc对象出来并将addr_client指向该对象,然后再使用

|
shutdown(listenfd); 

|
LZ先把有明显错误的地方改了。楼上也有提到的pthread_create (&tid, NULL, server_thread, (void *)&connectfd)
所有的服务子线程都引用了同一个栈变量connectfd,后一个连接总会覆盖前一个,新的连接connectfd都在堆上分配是一种替代方案。

|
没作过蓝牙程序,提供不了什么信息
不过上面提的有关的(void *)connectfd 的问题,开始你的用法是正确,只是让人看得别扭而已

另外作为一个服务程序,我不太赞同一个连接一个线程的方式,虽然没有错,但是在一个真正的产品中不应该出现这种做法--个人意见。

对于recv函数,返回0表示对端断开连接,而返回

    
 
 

您可能感兴趣的文章:

  • Linux下服务器端的线程分配
  • 如何调试多线程的代码? 多何调试网络代码 服务器的和客户端的
  • 请问:在socket编程的服务器端,想采用多线程来处理客户端的命令,应该怎样写啊?
  • 基于LINUX 线程的并发通讯服务器
  • linux并发服务器中epoll+多线程分别怎么理解?
  • 多余SOCKET服务器来说,用哪种线程安全锁性能最高?
  • 如何使用http下载文件,得到服务器的类型(IIS、apache)最好是多线程的,谢谢
  • 趋势的一道面试题:网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?
  • 多线程页面抓取服务器
  • java多线程,linux操作系统,双cpu服务器,问问稍微高级点的问题
  • haskell实现多线程服务器实例代码
  • c语言多线程实现并行服务器遇到点小问题,求解!
  • 多线程并发服务器设计
  • 服务器线程问题
  • epoll+多线程实现服务器问题
  • 为什么我的服务器实现不了多线程?
  • 菜鸟求助多线程并发服务器
  • 我写了一个linux下的socket(服务器客户端)+多线程的小程序,可是服务端总是收不到东西,哪个高人帮我看看
  • 建立多线程的服务器···
  • 一个libevent多线程的服务器引发的问题·····
  • c#多线程网络聊天程序代码分享(服务器端和客户端)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Java中多线程相关类Thread介绍
  • 一个进程创建了两个线程,如何使得当任何一个线程(比如线程a)结束时,同时也结束线程b,也就是使两个线程一起死掉,怎么办呢?
  • c#多线程更新窗口(winform)GUI的数据
  • java 线程,对当前线程(非主线程)调用sleep,为什么主线程(窗口)也没反应了
  • Windows和Linux下C++类成员方法作为线程函数方法介绍
  • 如何实现一个线程组内多线程的非同不执行,即一个线程执行完毕后再执行下一个线程???
  • c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解
  • 请问:进程创建的线程是怎样运行的啊,线程的处理函数运行完了,线程就退出了吗?
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 关于线程的问题,什么样的线程不是active线程?
  • 请问Linux核心支持多线程吗?开发库有线程库吗?线程好用吗?(稳定?)
  • 请问,在一个进程中创建多线程时如何能避免不同的线程获得同一个线程标识
  • 我的一个多线程服务里, 总是有一个线程莫名其妙的变成僵尸线程。
  • 能否通过线程id控制线程的状态?或是观察到线程的状态?
  • 如何在一个线程中启动另外一个线程,然后本线程就退出?
  • 我要设置一个线程的优先级, 这个属性结构并没有线程的id,它怎么知道是设置哪个线程呢?
  • 请问在java多线程中,是只有run(){}内的代码运行在一个新线程下呢?还是这个类中的代码都运行在一个新线程下?
  • gcc链接的库,分不分单线程版本的和多线程版本的?
  • 内核栈~ 内核线程 ~用户线程 之间关系 问题
  • 子线程的数据如何返回给主线程?
  • 如果父线程死掉 那么子线程会不会死掉呢


  • 站内导航:


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

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

    浙ICP备11055608号-3