+ -
当前位置:首页 → 问答吧 → 请教多线程socket的一个问题!急

请教多线程socket的一个问题!急

时间:2008-10-13

来源:互联网

写蓝牙虚拟串口通信的程序,基于RFCOMM协议的,实现和手机客服端的通信,根据网上查阅的一些资料,都是按类似的TCP套接字方式来写的程序,我也按那个思路整理
了一个程序,但是现在朋碰到一个问题,想利用多线程socket实现用个用户的并发处理,也就是希望多个手机客服端能
同时连接服务器端,但是程序中连接一个手机的时候可以正常收发信息,但是连接第2个手机时第一个手机的连接就被冲掉了,导致不能连接多个用户端,下面是我的
程序:
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/un.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>

#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024

void * server_thread(void *fd)
{
    int new_server_socket = (int)fd;
    char buffer[BUFFER_SIZE];
    bzero(buffer, BUFFER_SIZE);
    bzero(buffer,BUFFER_SIZE);

    printf("the server thread ID is:%lu\n",pthread_self());
    while(1)
    {
      memset (buffer, 0, sizeof(buffer));
    int length = recv(new_server_socket,buffer,BUFFER_SIZE,0);
    if (length < 0)
    {
        printf("Server Recieve Data Failed!\n");
        exit(1);
    }
    if (0 == strncmp(buffer, "\n", sizeof(buffer)))
      strncpy (buffer, "[null message]", sizeof(buffer)-1);
      printf("receive data from client:\n%s\n",buffer);
      if (strcmp(buffer,"exit")==0)
      {
        printf("the client exit!\n");
        break;
      }
    }
    close(new_server_socket);
    pthread_exit(NULL);
}
int main(int argc, char **argv)
{
  int listenfd, connectfd;
  struct sockaddr_rc addr_server, addr_client;
  int len_addr;
  char temp[100];
  fd_set readfd;
  pthread_t tid;
  len_addr=sizeof(addr_server);
  memset (&addr_server, 0, len_addr);

  if ((listenfd = socket(PF_BLUETOOTH,SOCK_STREAM,BTPROTO_RFCOMM)) == -1)
  {
    perror ("in listener thread::socket()");
    exit(1);
  }
  else
    printf("create server_socket success!:\n");
  addr_server.rc_family = PF_BLUETOOTH;
  addr_server.rc_bdaddr = *BDADDR_ANY;
  addr_server.rc_channel=(uint8_t)1;

  if ((bind(listenfd, (struct sockaddr *)&addr_server, len_addr)) == -1)
  {
      perror ("bind error:");
      exit (1);
  }
  else
      printf("bind success!\n");


  if ((listen(listenfd,LENGTH_OF_LISTEN_QUEUE)) == -1)
  {
      perror ("in listener thread:");
      exit (1);
  }
  else
      printf("Listening....\n");


    while(1)
    {
       len_addr = sizeof(addr_client);
        int connectfd = accept(listenfd,(struct
sockaddr*)&addr_client,&len_addr);
        if (connectfd < 0)
        {
            printf("Server Accept Failed!\n");
            break;
        }
        memset(temp,0,sizeof(temp));
        ba2str(&addr_client.rc_bdaddr,temp);
        printf("accept conenction from: %s\n",temp);
        pthread_t child_thread;
        pthread_attr_t child_thread_attr;
        pthread_attr_init(&child_thread_attr);
        pthread_attr_setdetachstate(&child_thread_attr,PTHREAD_CREATE_DETACHED);
       if( pthread_create(&child_thread,&child_thread_attr,server_thread,(void*)connectfd) < 0 )
       printf("pthread_create Failed!\n");
    }
    close(listenfd);
    return 0;
}
高手们能不能帮我分析下出错的 原因
另外要请教的一点是要写网络通信的程序这种方法是不是非常不好?      

作者: eques   发布时间: 2008-10-13