套接字客户端使用服务器接受的连接发送

Socket Client send using connection accepted by Server

本文关键字:连接 接发 客户端 服务器 套接字      更新时间:2023-10-16

客户端使用服务器接受的相同连接发送数据的方法正确吗?。

情况是这样的,我的电脑上运行着蓝牙服务器,另一边我有带客户端和服务器的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端没有接收到。

我看到的最大问题是,即使客户端断开连接,您也永远不会离开while(1)循环。Read将立即永远返回,读取0字节(检查返回代码<=0),试图发出套接字断开连接的信号。您的代码将进入一个紧密的无限循环,并耗尽其单线程所能使用的所有CPU资源

您需要确保始终检查套接字和IO返回代码并正确处理错误。套接字的错误处理通常是实际套接字代码的3倍。

当然,除非..........的东西是重要的比特。当人们隐藏与他们所问问题相关的代码时,总是很难分辨。

对我来说似乎是正确的,但在read之后,如果您处理字符串,则必须NUL'')终止缓冲区:

buf[bytes_read] = '';