2013-04-22 135 views
0

我正在进行套接字编程。现在,可以在客户端服务器之间轻松发送和接收字节。 现在,我想在客户端服务器之间发送字符串。以C语言在客户端 - 服务器编程中发送字符串

,我已经用了相同的代码是(客户端):

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); 

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

+0

什么是服务器代码打印中的'printf'?你能指望什么? – 2013-04-22 08:20:11

+0

您用于扫描的功能是什么?是scanf,fgets还是什么?什么是printf打印?你认为@anish在问什么? – 2013-04-22 08:32:41

+0

你是如何定义'recvbuf'的,是'char recvbuf [NNN];'还是'char * recvbuf'? – Rohan 2013-04-22 08:35:16

回答

0

首先字符串也是字节。只要您可以轻松发送/接收字节,就像发送/接收字符串一样。

更多提示。您应该知道您正在使用的TCP或UDP。使用UDP,每个send()都会发送一个数据包,recv()会收到一次数据包。但是tcp是一个字节流。这意味着send()只是将一些字节写入流中,并且不能指望recv()实际接收多少个字节,直到它返回。您必须设计一种解码字节流数据包的机制。说你的情况,你可以用'\ 0'拆分字符串包。

+0

是的,我正在使用TCP – 2013-04-22 09:41:06

0
recvbuf[iResult]= '\0'; 

可能是非常错误的,因为iResult可能是-1,你会在数组开始前写入,所以你会损坏内存。

除此之外,没有更多的细节我不知道。

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步。读取数据的准确长度先前计算的长度。

+0

尽管我同意你的看法,但这并不涉及这个问题。这不是OP的问题。 – 2013-04-22 11:52:41

相关问题