簡體   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