在客户端-服务器通信c++中接收到垃圾值
Garbage value received in client server communication c++
我试图在windows上编写一个简单的客户端-服务器程序。我的服务器端代码如下所示。
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
int main()
{
WSADATA WSAData;
SOCKET serverSock, clientSock;
SOCKADDR_IN serverAddr, clientAddr;
WSAStartup(MAKEWORD(2,0),&WSAData);
serverSock=socket(AF_INET,SOCK_STREAM,0);
serverAddr.sin_addr.s_addr=INADDR_ANY;
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(5555);
bind(serverSock,(SOCKADDR *)&serverAddr, sizeof(serverAddr));
listen(serverSock,0);
std::cout<<"Listening for incoming connections n";
char buffer[1024];
//memset(buffer,0,sizeof(buffer));
int clientAddrsize= sizeof(clientAddr);
if(clientSock = ( accept(serverSock,(SOCKADDR *)&clientAddr, &clientAddrsize ) != INVALID_SOCKET) )
{
std::cout<<"Client connected n";
recv(clientSock,buffer,int(strlen(buffer)),0);
std::cout<<"Client Says: " << buffer <<"n" ;
Sleep(10000);
//memset(buffer,0,sizeof(buffer));
closesocket(clientSock);
closesocket(serverSock);
WSACleanup();
}
return 0;
}
客户端代码看起来像:
#include <iostream>
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
int main()
{
WSADATA WSAData;
SOCKET clientSock;
SOCKADDR_IN addr;
WSAStartup(MAKEWORD(2,0),&WSAData);
clientSock=socket(AF_INET,SOCK_STREAM,0);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");
addr.sin_family=AF_INET;
addr.sin_port=htons(5555);
connect(clientSock,(SOCKADDR *)&addr,sizeof(addr));
std::cout <<"Connected to the server n";
//memset(buffer,0,sizeof(buffer));
char buffer[1024]={'h','e','l','l','o','.',' '};
send(clientSock,buffer,int(strlen(buffer)),0);
std::cout<<"Message sent n" ;
Sleep(10000);
closesocket(clientSock);
WSACleanup();
std::cout<<"Socket closed n";
return 0;
}
我在服务器端看到以下输出:
Listening for incoming connections
Client connected
Client Says: R☺
我所期待的是Client Says: Hello.
。不知道我为什么得到垃圾值。
感谢
char buffer[1024];
这在自动作用域中声明了一个本地char
数组。数组没有初始化任何内容,并且包含随机垃圾。
recv(clientSock,buffer,int(strlen(buffer)),0);
这将传递buffer
到strlen
。然而,buffer
包含垃圾,这是未定义的行为,最终结果可能是随机的,介于此时的立即崩溃或strlen
的某个奇怪的返回值之间。
此外,recv
的返回值被完全忽略,根本不检查。
所有套接字系统调用都可能失败,每个套接字系统调用send
、recv
和所有其他调用都可能失效。此外,即使它成功了,recv
也不能保证在一次拍摄中send
的所有内容都将在一次摄影中被recv
编辑。
例如,如果send
发送了10个字节,则对recv
的第一个调用可能返回1或5,表明只有前一个或五个字节立即为recv
。您不能保证recv
将同时接收这10个字节。否则,recv
将(显然(需要再次被调用以接收消息的其余部分。
您需要解决所有这些问题,才能拥有可靠的客户端/服务器应用程序:
检查所有系统调用的返回值。我所说的关于
recv
的一切也适用于send
。尝试send
10个字节可能会返回7,表示只发送了前7个字节,然后您必须实现适当的逻辑来发送剩余的字节。修复未定义的行为,将未初始化的值传递给
strlen
。
相关文章:
- "unknown ca"自生成的 CA、证书和客户端/服务器
- Java 客户端C++服务器数据发送/接收问题
- ZMQ - 客户端服务器:客户端意外关闭,服务器如何检测到?
- 用于本地网络运行的客户端服务器体系结构
- TCP套接字(客户端-服务器)recv()返回-1值
- C++启动另一个程序(客户端-服务器)的程序
- C++客户端/服务器聊天应用程序 - 从 Ubuntu 命令窗口扫描输入
- UDP客户端/服务器程序在不同的IP和端口上通信超过2个插座
- 为什么在此 UDP 客户端/服务器示例中没有必要绑定客户端套接字?
- TCP在客户端服务器之间传输时,数据是否有任何限制
- 是否可以添加多个服务器地址?(Asio,客户端>服务器)
- 通过TCP在客户端/ C#服务器之间传输文件C++
- TCP 客户端服务器程序
- 客户端服务器回声程序进入UDP的僵局
- 如何制作具有同步数据读/写功能的多客户端服务器
- Qt,客户端-服务器关系
- Winsock 简单客户端服务器,接收失败
- 在C++中对客户端/服务器应用进行单元测试
- 在客户端/服务器计算器C 方面遇到麻烦
- 客户端服务器简单示例非块