请教多线程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;
}
高手们能不能帮我分析下出错的 原因
另外要请教的一点是要写网络通信的程序这种方法是不是非常不好?
了一个程序,但是现在朋碰到一个问题,想利用多线程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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28