【问题标题】:Converting pointer to string and send as char array not working properly将指针转换为字符串并作为字符数组发送无法正常工作
【发布时间】:2015-05-16 13:21:09
【问题描述】:

我在通过套接字从我的 C++ 客户端向我的 Java 服务器发送目录名称时遇到问题。

发送诸如“hello world”之类的普通消息,效果很好,但以下没有,我无法弄清楚问题是什么:

char const * files = ffd.cFileName; // get directory name

            string str(files, 0, strlen(files)); // convert pointer to string, right?

            char mess[str.size()];
            strcpy(mess, str.c_str()); // make char array :)

            cout << "Send file: " << mess << " with strlen: " << strlen(mess) << " and sizeof: " << sizeof(mess) << endl;

            int sent = 0;
            if ((sent = send(connectSocket, mess, sizeof(mess), 0)) == SOCKET_ERROR)
            {
                closesocket(connectSocket);
                WSACleanup();
                connectToServer();
            }

java 服务器只接收这样的目录名称:

wam
p
Win
dow
s
Win
dow
s.o
ld
wxW
idg
ets

我无法理解我错过了什么,因为我已经尝试了所有可能的方法来做到这一点并且 C++ 客户端打印如下:

"发送文件:windows with strlen: 7 and sizeof: 7"

我不认为 java 服务器是问题,因为我可以完美地接收正常的字符串和消息,但无论如何这里是 JAVA 代码:

is = socket.getInputStream();
byteArray = new byteArray[1024]; 
    while (true) {
                c = is.read(byteArray, 0, byteArray.length);
                String recv = new String(byteArray, 0, c);
                System.out.println(recv);
                if (recv.equals("<EOF>")){
                    break;
                }
                list.add(recv);
            } 

如果您有其他要求或任何事情,请发表评论,我会解决它。

【问题讨论】:

  • 请注意mess 包含str.size() 字节,然后您将str.size() + 1 字节写入其中。
  • 你如何发送“像 Hello World 这样的普通消息”?
  • string str(files, 0, strlen(files)); 可以简化为 string str(ffd.cFileName); 如果它的 cFileName 是一个以空值结尾的字符串。
  • 另外,不要创建不必要的字符缓冲区mess,只需将您的发送调用更改为send(connectSocket, str.c_str(), str.length(), 0)
  • 它在您的服务器上被拆分,因为 TCP 是基于流的。 is.read() 在客户端完成发送其完整消息之前到达其内部接收缓冲区的末尾,因此它只打印它到目前为止收到的内容。

标签: java c++ pointers char send


【解决方案1】:

问题:您是通过 TCP 还是 UDP 发送?我猜是 TCP,如果是这种情况,您需要将套接字视为更多的流。该流可能会分解成一堆数据包-您无法真正控制它。我可能会做的是为每个目录的字符串长度添加前缀(例如,3foo、4barz 等),从套接字读取并确定什么构成逻辑块或字符串,然后根据它组装/打印字符串。如果你走那条路,你需要跟踪每次阅读的数量,直到你认为你已经完成了。

【讨论】:

  • 是的,我正在使用 TCP。但这怎么可能,我可以发送“hello world!!!!”之类的东西但不是当我尝试转换指针时。它如何/为什么会被分解成一堆数据包?我不擅长c++,边学Java边学c++。
  • 这里有一些关于 TCP ischool.utexas.edu/~l38613dw/website_spring_03/readings/… 的信息,其中包括一些关于数据包拆分的信息,这里有一些关于重组数据包的信息 wireshark.org/docs/wsdg_html_chunked/ChDissectReassemble.html 关于如何重组拆分数据包。谷歌是你的朋友 :)
  • 我解决了,但你和阿特拉斯都让我走上了正确的道路! 1+ 也有很棒的信息!谢谢。
【解决方案2】:

我解决了,刚刚添加了byteArray = new byte[1024];,现在可以了:

         while (true) {
            byteArray = new byte[1024]; // I ADDED THIS AND NOW THE JAVA SERVER RECEIVES IT CORRECTLY!

            c = is.read(byteArray, 0, byteArray.length);
            recv = new String(byteArray, 0, c);


            System.out.println(recv);
            if (recv.equals("<EOF>")){
                break;
            }
            list.add(recv);
        } 

【讨论】:

    猜你喜欢
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    相关资源
    最近更新 更多