是否正确的方法客户端使用服务器接受的相同连接发送数据?
情况是这样的,我的PC上运行蓝牙服务器,另一方面我有安装客户端和服务器的android手机。从android端客户端开始连接。我正在使用android示例中的蓝牙聊天示例。
android上的服务器客户端看起来像
BluetoothSocket socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the BluetoothSocket input and output streams
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
在PC方面,我使用Bluez库来实现服务器和客户端 代码包括蓝牙接收线程和主线程,每当服务器接受来自android手机的连接时我只是将套接字值分配给全局变量,并且每当客户端需要发送它使用相同套接字发送的数据时,
服务器: -
int GLOBAL_CLIENT;
void* recive_bluetooth_trd(void*)
{
...............................
..............................
client = accept(s, (struct sockaddr *)&rem_addr, &opt);
GLOBAL_CLIENT=client;
while(1){
bytes_read = read(client, buf, sizeof(buf));
....................
...................
}
客户端: -
void clinet(char *msg, int length){
........................
int bytes_write=write(GLOBAL_CLIENT,message, length);
..........................
}
我的问题是,这是一种正确的方法吗?问题是,有时客户端从PC成功发送数据但没有在android端接收。
答案 0 :(得分:0)
对我来说似乎是对的,但在read
之后你必须NUL
('\0'
)终止你的缓冲区,如果你正在处理字符串:
buf[bytes_read] = '\0';
答案 1 :(得分:0)
我看到的最大问题是,即使客户端断开连接,您也不会离开while(1)
循环。读取将立即返回0字节读取(检查返回代码< = 0),尝试发信号通知套接字已断开连接。您的代码将进入一个紧密的无限循环并耗尽它可以获得单线程动作的所有CPU资源。
您需要确保始终检查套接字和IO返回代码并正确处理错误。套接字的错误处理通常是实际套接字代码的3倍。
除非..........
内容是重要的。当人们隐藏与他们问的问题相关的代码时,总是很难说。