C Winsock编程:输入垃圾

我正在编写一个非常简单的套接字服务器,遵循此示例代码 。 服务器启动并运行,我可以通过telnet连接到它(实际上使用Putty)。 每当收到新连接时,我会生成一个新线程,代码如下:

DWORD WINAPI receive_cmds(LPVOID lpParam) { char outbuffer[100]; outbuffer[0] = '\0'; char inbuffer[100]; inbuffer[0] = '\0'; int res; SOCKET current_client = (SOCKET)lpParam; while (1) { res = recv(current_client, inbuffer, sizeof inbuffer - 1, 0); if (res > 0) { inbuffer[res] = '\0'; printf("Got '%s'\n", inbuffer); } Sleep(10); if (res == 0) { closesocket(current_client); ExitThread(0); } //printf("%s\n", 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] = '\0'; printf("Got '%s'\n", inbuffer); } 

您需要在缓冲区中为终结器留出空间,因此您无法使用所有缓冲区来接收数据。 你应该检查-1,并在打印之前终止缓冲区使其成为一个字符串。

我猜recv()返回“-1”(意思是错误)。

我必须看到你的其余代码才能猜出原因。 尝试测试返回-1然后调用WSAGetLastError()以找出错误的原因。