0

我目前正在做套接字编程。现在,可以在客户端-服务器之间轻松发送和接收字节。现在,我想在客户端服务器之间发送字符串。

我用于相同的代码是(客户端):

    strcpy(recvbuf, sendbuf);
    send(ConnectSocket, recvbuf, strlen(recvbuf), 0);
    printf("\nSending string...");   

(服务器)

    iResult = recv(ClientSocket, recvbuf, sizeof(recvbuf) -1, 0);
    recvbuf[iResult]= '\0';
    strcpy(sendbuf2, recvbuf);
    printf("String recieved = %s", sendbuf2);

但是,它没有显示正确的结果。有什么链接可以帮助我吗?

4

3 回答 3

0

首先字符串也是字节。只要您可以轻松地发送/接收字节,就可以以同样的方式发送/接收字符串。

还有一些提示。您应该了解您正在使用的 TCP 或 UDP。使用 UDP,每个 send() 发送一个数据包,recv() 接收一次数据包。但是 tcp 是一个字节流。这意味着 send() 只是将一些字节写入流,并且您无法期望 recv() 在返回之前实际接收到多少字节。您必须设计一种机制来从字节流中解码数据包。说你的情况,你可以使用 '\0' 来分割字符串数据包。

于 2013-04-22T08:33:04.197 回答
0
recvbuf[iResult]= '\0';

可能是非常错误的,因为 iResult 可能是 -1 并且您会在数组开始之前写入,因此您会破坏内存。

除此之外,没有更多细节我无法知道。

于 2013-04-22T08:49:51.260 回答
0

我认为 recv() 被滥用了。

  1. 需要检查recv() 的返回值。如果返回码为负数,则不应继续其余行。
  2. 要获得 recv() 的正值,您应该设置标志(最后一个参数)。'0' 表示接收所有长度为“sizeof(recvbuf) -1”的字节。因此,在收到所有 1023 个字节之前,永远不会返回该代码。
  3. 确定套接字中有多少字节并读取确切的字节长度。

尝试这个...

int length_to_read = 0;

length_to_read = recv(ClientSocket, recvbuf, sizeof(recvbuf) -1, MSG_PEEK);
if( length_to_read < 0 ) {
  // error
  return;
}

iResult = recv(ClientSocket, recvbuf, length_to_read, 0);
if( iResult < 0 ) {
  // error
  return;
}

PS。以上代码是多余的 recv() 系统调用。在一般的 TCP/IP 套接字编程中,您应该知道数据的确切长度。例如,长度和尾随数据的前 4 个字节。为什么不定义 c/s 接口的长度?

步骤 1. 计算数据大小。步骤 2. 发送长度和数据。

步骤 1. 读取 4 个字节的长度。步骤 2. 读取数据精确长度先前计算的长度。

于 2013-04-22T10:51:09.240 回答