C++ C++;套接字接收错误命令,而不是预期命令

C++ C++;套接字接收错误命令,而不是预期命令,c++,sockets,winsock,C++,Sockets,Winsock,我正在学习socket编程,以便在即将到来的项目中使用,我已经对这个问题进行了广泛的研究。基本上,所有这些程序都需要在客户端计算机上(本地,即我的计算机)需要连接到远程服务器并发送命令(它已经完成了,我已经让它读回Apache服务器统计信息给我) 发生的情况是:我相信套接字设置正确,但服务器接收随机垃圾缓冲区(其中一个由“'>Z”组成)。我尝试过各种套接字设置、不同绑定等 我已经在启动它的过程中将初始化winsock,创建一个套接字,绑定网络,然后执行一个侦听循环和while(1)recv数据

我正在学习socket编程,以便在即将到来的项目中使用,我已经对这个问题进行了广泛的研究。基本上,所有这些程序都需要在客户端计算机上(本地,即我的计算机)需要连接到远程服务器并发送命令(它已经完成了,我已经让它读回Apache服务器统计信息给我)

发生的情况是:我相信套接字设置正确,但服务器接收随机垃圾缓冲区(其中一个由“'>Z”组成)。我尝试过各种套接字设置、不同绑定等

我已经在启动它的过程中将初始化winsock,创建一个套接字,绑定网络,然后执行一个侦听循环和while(1)recv数据

我还没有让服务器(在远程计算机上,托管在数据中心)输出消息。这是我目前唯一的目标。我提前感谢大家的帮助,代码在前面(这是完整的代码,抱歉太长了)

客户端代码:

char *host = "127.0.0.1";
        SOCKET clientsock;
        struct sockaddr_in server_address;

        struct hostent *host_info;

        WSADATA WSAData;
        if(WSAStartup(MAKEWORD(2,2), &WSAData) != -1) {
            cout << "WINSOCK2 Initialized" << endl;         
            if((clientsock = socket(AF_INET, SOCK_STREAM, 0)) != SOCKET_ERROR) {
                cout << "Socket Created" << endl;

                char opt[2];
                opt[0] = 0;
                opt[1] = 1;

                //setsockopt(clientsock, SOL_SOCKET, SO_BROADCAST, opt, sizeof(opt));

                host_info = gethostbyname(host);                    

                server_address.sin_family = AF_INET;
                server_address.sin_addr = *((struct in_addr *)host_info->h_addr);                   
                server_address.sin_port = htons(80);

                if(connect(clientsock, (struct sockaddr *)&server_address, sizeof(struct sockaddr)) == 0) {
                    cout << "Connected to host" << endl;
                    char COMMAND[22] = "SVR --WINSOCK-VERIFY\0";
                    if(send(clientsock, COMMAND, sizeof(COMMAND), 0)) {
                        cout << "Command Sent" << endl;                         
                        closesocket(clientsock);
                    }
                    else {
                        cout << "ERROR - Could not send command. " << "Error: " << WSAGetLastError() << endl;
                        closesocket(clientsock);
                        WSACleanup();
                    }
                }
                else {
                    cout << "ERROR - Could not connect to host. " << "Error: " << WSAGetLastError() << endl;
                    closesocket(clientsock);
                    WSACleanup();
                }                   
            }
            else {
                cout << "ERROR - Could not create the socket. " << "Error: " << WSAGetLastError() << endl;                  
                WSACleanup();
            }               
        }
        else {
            cout << "ERROR - Could not initialize WINSOCK2. " << "Error: " << WSAGetLastError() << endl;                                
            WSACleanup();
        }
char*host=“127.0.0.1”;
插座插座;
服务器地址中的结构sockaddr\u;
结构主机*主机信息;
WSADATA WSADATA;
if(WSAStartup(MAKEWORD(2,2),&WSAData)!=-1){

cout对
send
/
recv
的调用可能不会发送/接收您在其第三个参数中指示的字节数,事实上,大多数情况下,它们发送/接收的字节数比您预期的要少。您通常必须循环,直到发送/接收完整个数据。还要注意:

char buffer[100];
recv(clientsock, buffer, sizeof(buffer), 0);
cout << buffer;

const char*
类型为“127.0.0.1”,不能强制转换为sockaddr指针,它们不兼容。在这里,您应该使用
getaddrinfo
解析IP地址(请注意,您可以使用域名,此函数将解析它)。网上有很多关于如何使用此函数的教程,只需搜索“getaddrinfo”。

谢谢你,Fontanii。我已经包含了一个空字符(\0)在字符串中,使用循环在服务器端对其进行排序。该程序仍然认为它正在接收命令,尽管它只是垃圾数据。我现在的问题是:使用正确的代码(我最初在帖子中编辑过),现在运行在localhost上用于测试,将不会传递命令。客户端读取正确连接并发送了命令的消息,但服务器没有显示任何消息。有什么想法吗?从“手册”页上看不完全清楚,但实际上是阻塞
send()
将发送整个消息,如有必要,将进行阻止,直到可以发送为止。@EJP手册页确实提到了这一点。但是,MSDN声明“如果没有发生错误,send将返回发送的总字节数,该字节数可以小于len参数中请求发送的字节数。”。因此,在发送时循环是正确的,除非您希望代码依赖于平台。顺便说一句,OP使用的是Windows,因此在发送时循环是正确的。Fontanii,我曾经在我的原始帖子中编辑过代码。我已经更改了强制转换到结构的字符格式,以匹配其请求的类型,即char。现在,代码till确实有效,我对如何确切地确定如何使用getaddrinfo()几乎一无所知我对C++还有些陌生,很抱歉,我很感激您的帮助。另外,我还没有从服务器监视器窗口接收到诸如BBR之类的非垃圾重复值。您仍然使用SokAdDr结构错误。我建议您阅读本教程:这是一个很棒的教程,它解释了如何处理SokAdDr结构,CONN。连接、绑定以及使其工作所需的一切。
char buffer[100];
recv(clientsock, buffer, sizeof(buffer), 0);
cout << buffer;
int size = sizeof((struct sockaddr *)"127.0.0.1");