2012-02-23 103 views
0

所以我得到套接字通信,我得到正确的消息...但是,当我尝试从接收缓冲区中提取它...它不工作。我的代码看起来是这样的:通过套接字接收的数据不能使用C++

void CClientSocket::OnReceive(int nErrorCode) 
{ 
    char buff[1000]; 
    int ibuf = Receive(buff,sizeof(buff)); 
    buff[sizeof(buff)-1] ='\0'; 
    CSocket::OnReceive(nErrorCode); 
} 

当我在调试运行,浅黄色的价值包含正确的消息......有一堆随机字符填充数组的未使用部分一起。然而,我不能使用这些数据......如果我尝试转换为CString,或者甚至将字符传输到不同的数组......没有任何工作。我很困惑,我真的不知道该怎么做。

让我知道你是否需要更多的信息,或者如果我不清楚任何方式。

编辑:一些代码,我试图提取数据

CString string; 
string = CString(buff); 

char *msg; 
msg = new char[ibuf] 
for(int i = 0; i < ibuf; i++){ 
    msg[i] = (char)buff[i]; 
} 

编辑:澄清 时,我说: '没有什么作品' 我的意思是,当我试图转换它,结果是和空的CString或空char等...没有错误。

+0

您可以发布相关的代码吗?不工作?即:当你尝试“转换为CString”? – netcoder 2012-02-23 16:09:22

+0

这可能是他们发明'std :: string'的原因:D – Griwes 2012-02-23 16:12:01

+1

我们是程序员,能够理解错误信息。不要只说“没有用”。显然,如果你正确地编写你的代码,某些事情会发挥作用。 – 2012-02-23 16:12:51

回答

4
int ibuf = Receive(buff,sizeof(buff)); 
buff[sizeof(buff)-1] ='\0'; 

而不是第二行,将零字节放在buff[ibuf]。但在此之前,请添加一个错误检查(确保ibuf > 0,如果没有,则将其视为连接删除。)另外,如果您这样做,则应该Receive(buff, sizeof(buff)-1);(注意-1 - 这说明终止字符 - 谢谢@Altnitak为了指出这一点)。

另一方面...我也会争辩说,这是没有办法对待套接字代码。字符串不是通过网络自动发送的。他们将分裂。如果您控制协议,我建议您离开以字符串为中心的Universe视图,并构建您的网络通信,以便消息以整数(uint16_tuint32_t,并确保呼叫htons/htonl等)指示长度之后的有效载荷。然后保持缓冲传入的字节并在足够满足指定长度时处理它们。

如果您不控制协议,请找到一个方便的标记,您可以使用该标记来决定何时处理内容,并缓冲字节,直到达到该标记。 (例如,如果您正在执行HTTP,则可能会缓冲字符,直到在处理标题时看到换行符,然后决定响应内容的某个缓冲区大小...)

+0

1.你需要考虑'ibuf == sizeof(buff)'2。重新原子发送等?如果它是一个TCP套接字,则无关紧要。 – Alnitak 2012-02-23 16:24:26

+0

@Alnitak - 不,这不是无关紧要的。你不能'write(fd,foo,len)',并且假设另一端完全从'read'返回'len'。他们可能会在下次调用时将一个调用中的第一个“n”字节读取为“read”,然后是“len - n”。 – asveikau 2012-02-23 16:27:37

+0

对,我明白你的意思,除非他不要求'len',他要求'sizeof(buff)',即1000字节。如果是TCP,那么即使系统写入的数据少于该数据,系统也会很好地尝试读取这些数据,即系统将从数据流中返回所需的数据量,而不受数据包边界的限制。 – Alnitak 2012-02-23 16:31:51

相关问题