【发布时间】:2011-09-10 17:09:49
【问题描述】:
我在使用 Winsock2 包装类(客户端-服务器)时遇到了问题,经过无数小时的摸索,我决定最好征求您的意见。
更具体地说,问题是每次我使用我的 Send() 函数时,客户端和服务器(并非总是如此!)都会发送一两个额外的字节!
例如,我使用 SendBytes("Hello") 并且 Recv 函数返回 "Hello•",并在字符数组的末尾带有 '•' 或其他随机字符。
//main.cpp (Client)
#include "Socket.h"
int main()
{
NetworkService::Client cService = NetworkService::Client();
int res = cService.Initialize("127.0.0.1","20248");
if(res == 0){
int local = cService.SendBytes("Hello!");
printf("Bytes Sent: %ld\n", local);
cService.Shutdown();
char* temp = cService.Recv();
printf("String Recieved: %s - Size: %d",temp,strlen(temp));
printf("\nSTRLEN: %d",strlen("X5"));
}
else{
cService.Clean();
}
cService.Close();
while(!kbhit());
return 0;
}
当然,服务器发送字符串“X5”,客户端打印strlens ...
//The result with "X5" as the dummy text:
String Recieved: X5? - Size: 3 //Notice the extra '?' character
STRLEN: 2
发送 // 接收函数
int NetworkService::Client::SendBytes(char* lData){
int local = send( ConnectSocket, lData, (int)strlen(lData), 0 );
if (local == SOCKET_ERROR) {
Close();
return WSAGetLastError();
}
return local;
}
char* NetworkService::Client::Recv(){
recv(ConnectSocket, recvbuf , recvbuflen, 0);
return recvbuf;
}
我们将不胜感激^_^。
【问题讨论】:
-
您没有在字符串中发送终止 NUL 字节。
-
非常感谢您这么快回答!事情就是这样,我在字符串的末尾添加了 '\0' ,但它没有做任何事情。我仍然得到随机插入。
-
@christian:你已经通过字符串文字有一个隐含的 \0 。但是,为了发送它,您需要调整 send() 调用中的 size 参数。将其从 strlen(lData) 更改为 strlen(lData)+1 以包括尾随 \0。如果您仍然不确定为什么需要这样做,请务必查看 strlen() 函数。
-
这不是真的必要,我之前只是用它来比较长字符串的长度,因为我在处理超过 2 字节字符串的问题。我认为 (ldata)+1 会起作用,谢谢,我会试一试!
标签: c++ sockets networking winsock winsock2