繁体   English   中英

Linux上的C ++套接字连接

[英]C++ Socket Connection on Linux

我是C ++的新手,正在尝试建立与远程服务器的连接,但是在使其正常工作时遇到了问题。 规范:Ubuntu 16.04,预安装了g ++编译器,当我运行以下代码时,它返回“ pre-standard C ++”:

if( __cplusplus == 201103L ) std::cout << "C++11\n" ;
else if( __cplusplus == 19971L ) std::cout << "C++98\n" ;
else std::cout << "pre-standard C++\n" ;

我的代码如下:

#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>

using namespace std;

int main() {

    int client;
    int portNum = 80;
    bool isExit = false;
    int bufsize = 1024;
    char buffer[bufsize];
    const char ip[] = "216.58.210.36"; //google ip for test connection

    const char req[] = "GET / HTTP/1.1\nHost: www.google.com"; //test
    char res[bufsize];

    struct sockaddr_in server_addr;

    client = socket(AF_INET, SOCK_STREAM, 0);
    if (client < 0) {
        cout << "\nError establishing socket..." << endl;
        exit(1);
    }

    cout << "\n=> Socket client has been created..." << endl;

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(portNum);
    inet_aton(ip, &server_addr.sin_addr);

    if (connect(client,(struct sockaddr *)&server_addr, sizeof(server_addr)) == 0){
        cout << "=> Connection to the server port number: " << portNum << endl;
    }

    send(client, req, bufsize, 0);
    cout << "=> Awaiting confirmation from the server..." << endl;
    recv(client, buffer, bufsize, 0);
    cout << "=> Connection confirmed, response:" << buffer << endl;

    cout << res << endl;

    close(client);
    return 0;
}

创建了客户端,并且套接字已连接,但是代码挂在对recv()的调用上,并且未收到响应。 我假设这是因为我发送的请求格式/数据类型/等错误。 谁能告诉我我要去哪里错了? 干杯!

您尚未发送完整的HTTP请求,因此服务器正在等待更多数据。

您需要使用\\ r \\ n作为行分隔符,并且您的请求必须以空行结尾:

const char req[] = "GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n";

另外,如其他人所评论,您需要检查错误。

您还从缓冲区发送了1024字节的数据,该缓冲区要小得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM