0

我正在尝试通过套接字发送一个字符串数组并在另一端接收它。

这是我的客户端(发送数据的一方):

char* client_hello[] =
{
  "Type             client_hello",
  "Version          SSLv3.0",
  "Session ID       1",
  "Random           1as2@3%$h&KF(*)JAGG&(@H%A$D@J*@@",
  "Cipher-Suites    TLS_RSA_WITH_RC4_128_SHA",
  "Compression      null(0)"
};

SendBytes = send(sock, client_hello, 6, 0);

这是我的服务器端(接收数据的端)

int inMsgLen = recvfrom(clntSock, inMsg, 1024, 0,(struct sockaddr *)&clntAddr, (socklen_t*)&clntAddrLen);

    if (inMsgLen < 0) {
        //printf("Error in recvfrom() errno=%d\n", errno);
        continue;//exit(1);
    }else if (inMsgLen > 1024) {
        printf("Received message too long (size=%d)\n", inMsgLen);
        exit(1);
    }else{
        printf("Received Message: %s\n", inMsg);
    }

inMsg被声明为char inMsg[1024];

这是服务器端的输出:

Received Message: +?

我究竟做错了什么 ?如何发送/接收整个 client_hello 数组?

4

2 回答 2

2

我正在尝试通过套接字发送一个字符串数组并在另一端接收它。

但是代码正在发送数组的前六个字节char*(正如WhozCraig在对该问题的评论中提到的那样):

SendBytes = send(sock, client_hello, 6, 0);

接收方正在读取指针地址并将它们视为字符串,因此是垃圾。

要更正,请依次发送每个字符串,但您需要创建一个协议,该协议定义字符串的开头和结尾,因为字节作为流从套接字写入和读取,而不是一些message的概念。例如,在每个字符串前面加上它的长度(以换行符结尾的数字序列将是一个简单的选项),然后是实际的字符串:

18\nSession ID       124\nCompression      null(0)0\n

接收端将读取换行符,将读取的内容转换为int,分配一个缓冲区以包含字符串(为空终止符记住空间),然后char从套接字读取该数字。长度为零可用于终止字符串列表的传输。

请注意,调用send()可能会导致仅发送所请求数据的一部分。代码需要通过跟踪到目前为止发送的字节数并索引到正在发送的缓冲区来满足这一点。

于 2013-09-11T07:50:19.103 回答
0

如果您尝试进行循环,则使用“for”发送...也许服务器可以理解。逐行制作client_hello [i]..

于 2019-08-20T23:27:59.037 回答