【问题标题】:Socket Client send using connection accepted by Server套接字客户端使用服务器接受的连接发送
【发布时间】:2013-08-27 05:40:09
【问题描述】:

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

情况是这样的,我的 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 库来实现服务器和客户端。
该代码包括蓝牙接收线程和一个主线程,每当服务器接受来自安卓手机的连接时,我只需将套接字值分配给全局变量,并且每当客户端需要发送数据时,它使用同一个套接字发送,

服务器:-

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 端没有接收。

【问题讨论】:

    标签: c++ c sockets bluetooth bluez


    【解决方案1】:

    我看到的最大问题是,即使客户端断开连接,您也永远不会离开 while(1) 循环。读取将立即永远返回,读取 0 字节(检查返回代码

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

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

    【讨论】:

    • 您好,感谢您提供宝贵的信息。这是我的完整代码pastebin.com/embed_js.php?i=fa2Xv9Y1
    • @Haris 是的,您没有处理断开连接,这将使您的程序非常难过。如果你得到一个 0,你需要break
    • 不行,如果<= 0需要中断
    【解决方案2】:

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

    buf[bytes_read] = '\0';
    

    【讨论】:

    • 除非您想将其视为字符串,否则您不必终止缓冲区。
    • @xaxxon,我相信 OP 正在用字符串处理: void clinet(char *msg,
    • 如何传递缓冲区? char * 几乎是你如何做的,不管那里实际有什么数据 - 二进制或字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2016-12-09
    相关资源
    最近更新 更多