我正在编写一个非常简单的套接字服务器,遵循此示例代码 。 服务器启动并运行,我可以通过telnet连接到它(实际上使用Putty)。 每当收到新连接时,我会生成一个新线程,代码如下:
DWORD WINAPI receive_cmds(LPVOID lpParam) { char outbuffer[100]; outbuffer[0] = ' '; char inbuffer[100]; inbuffer[0] = ' '; int res; SOCKET current_client = (SOCKET)lpParam; while (1) { res = recv(current_client, inbuffer, sizeof inbuffer - 1, 0); if (res > 0) { inbuffer[res] = ' '; printf("Got '%s'n", inbuffer); } Sleep(10); if (res == 0) { closesocket(current_client); ExitThread(0); } //printf("%sn", inbuffer); strcpy(inbuffer, ""); } }
一旦我连接它打印这个乱码:
如果我在客户端输入“hello”然后“stackoverflow”,这就是我得到的:
即使我明确地声明了行’ 0’的结尾,它似乎需要更多的行,加上我不知道为什么它打印输入两次,第二个是第一个减去第一个或第二个字符。
有什么帮助理解发生了什么? 提前致谢。
编辑:根据展开的建议进行相应编辑
您应该做更好的错误检查,以及更合理的缓冲区处理:
res = recv(current_client, inbuffer, sizeof(inbuffer), 0);
应该
res = recv(current_client, inbuffer, sizeof inbuffer - 1, 0); if (res > 0) { inbuffer[res] = ' '; printf("Got '%s'n", inbuffer); }
您需要在缓冲区中为终结器留出空间,因此您无法使用所有缓冲区来接收数据。 你应该检查-1,并在打印之前终止缓冲区使其成为一个字符串。
我猜recv()返回“-1”(意思是错误)。
我必须看到你的其余代码才能猜出原因。 尝试测试返回-1然后调用WSAGetLastError()以找出错误的原因。
以上就是c/c++开发分享C Winsock编程:输入垃圾相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/518793.html