2014-01-22 151 views
1

我正在用C++寫一個簡單的套接字客戶端。下面是代碼:C++ TCP套接字客戶端無法發送數據

main.h:

#ifndef CC_Client_main_h 
#define CC_Client_main_h 

void error(std::string msg); 


#endif 

的main.cpp

#include <iostream> 
#include "communications.h" 
#include "main.h" 
void error(std::string msg) { 
    std::cerr << msg; 
    exit(-1); 
} 


int main(int argc, char **argv) { 
    Communication communication = Communication("localhost", 8888); 
    communication.print_hosts(); 
    int success = communication.send_str("hello!\n"); 
    if (success<0) { 
     std::cerr << "Error writing data.\n"; 
    } 
    return 0; 
} 

communications.h

#ifndef __CC_Client__communications__ 
#define __CC_Client__communications__ 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <time.h> 
#include <netdb.h> 
#include <string> 
#include <iostream> 
#include main.h 

class Communication { 
private: 
    int sock; 
    struct hostent *host; 
    struct sockaddr_in server_address; 
    char *host_str; 
    int port; 
public: 
    Communication(char *host, int port); 
    ~Communication(void); 
    hostent &get_host(); 
    void print_hosts(void); 
    int send_str(char *send_string); 
}; 

#endif /* defined(__CC_Client__communications__) */ 

communications.cpp

#include "communications.h" 
#include "main.h" 
void print_addr(unsigned char *address) { 
    printf("%d.%d.%d.%d\n", address[0], address[1], address[2], address[3]); 
} 

Communication::Communication(char *host, int port) { 
    this->port = port; 
    this->host_str = host; 
    this->sock = socket(AF_INET, SOCK_STREAM, 0); 
    if (this->sock<0) { 
     error("Failed to build socker object.\n"); 
    } 
    this->host = gethostbyname(host); 
    if (!this->host) { 
     error("Failed to resolve host.\n"); 
    } 
    memset((char*)&this->server_address, 0, sizeof(this->server_address)); 
    server_address.sin_family = AF_INET; 
    server_address.sin_port = htons(port); 

    memcpy((void *)&this->server_address.sin_addr, this->host->h_addr_list[0], this->host->h_length); 

    if (connect(this->sock, (struct sockaddr*)&server_address, sizeof(this->server_address))<0) { 
     error("Failed to connect socket.\n"); 
    } 
} 

Communication::~Communication() { 
    std::cout << "Closing connection. . .\n"; 
    shutdown(this->sock, SHUT_RDWR); 
    std::cout << "Communication object at " << this << " being destroyed\n"; 
} 

void Communication::print_hosts() { 
    for (int i=0; this->host->h_addr_list[i]!=0; i++) { 
     print_addr((unsigned char*) this->host->h_addr_list[i]); 
    } 
} 

int Communication::send_str(char *send_string) { 
    char buffer[strlen(send_string)]; 
    int num_bytes = write(this->sock, buffer, sizeof(buffer)); 
    return num_bytes; 
} 

我試圖用netcat來測試客戶端這樣的:

$ nc -lv 8888

但它接收到的數據似乎是不正確的:

$ nc -lv 8888 
??_? 

我的程序並沒有給我任何錯誤,當我運行它。這些數據來自哪裏?

我正在運行Mac OS X Mavericks。 About this mac screenshot

回答

3

你沒有把任何數據到緩衝區中send_str

還我懷疑的sizeof(緩衝區)不會做你期望的。我的猜測是它會是sizeof(char *)

+0

對不起。我很累,這很尷尬,所以我要刪除這個問題。再次抱歉。 – 735Tesla

+0

你能爲我舉報這件事嗎,我可以刪除它嗎? – 735Tesla

+0

什麼 - 並失去我的2票 - 不太可能 – pm100

相關問題