套接字客户端使用服务器接受的连接发送
Socket Client send using connection accepted by Server
客户端使用服务器接受的相同连接发送数据的方法正确吗?。
情况是这样的,我的电脑上运行着蓝牙服务器,另一边我有带客户端和服务器的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] = ' ';
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- 从网链套接字请求连接设备的列表
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 如何在 2 台主机之间保持 UDP 套接字连接打开
- 将"libpqxx"与Visual Studio 2013链接/安装,以便与PostgrSQL建立C++连接
- C++关闭套接字以启动新连接
- Opencv 不适用于套接字连接
- 使用单个套接字处理多个传入的 UDP 连接
- 连接UDP套接字,但仍然接收来自其他源的数据报
- C++通过套接字连接发送矢量
- 为什么我在蓝牙连接()上收到"java.io.IOException:读取失败,套接字可能关闭或超时,读取re
- boost1.62 在 docker 容器中重新连接后套接字损坏
- 尝试连接到 TCP 套接字 (Linux) 时连接被拒绝
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- 在已完成的std::线程连接上发生死锁