2013-05-10 60 views
11

下面是我想出了以下基本套接字代碼:創建一個基本的C/C++ TCP套接字作家

//General includes: 
#include <iostream> 
#include <stdio.h> 
#include <string> 

//Network related includes: 
#include <sys/socket.h> 
#include <netdb.h> 
#include <arpa/inet.h> 

//Target host details: 
#define PORT 1234 
#define HOST "74.74.74.74" 

using namespace std; 

//Function prototypes: 
string MessageFormat(int, char**); 
void MessageSend(string); 

int main(int argc, char *argv[]) 
{ 
    //Parse arguments and format message: 
    string message = MessageFormat(argc, argv); 

    //Send the message out: 
    MessageSend(message); 

    return 0; 
} 

string MessageFormat(int argc, char *argv[]) 
{ 
    //Massage the command line parameters 
    // into my desired payload format. 

    return message; 
} 

void MessageSend(string message) 
{ 
    int sd, ret; 
    struct sockaddr_in server; 
    struct in_addr ipv4addr; 
    struct hostent *hp; 

    sd = socket(AF_INET,SOCK_DGRAM,0); 
    server.sin_family = AF_INET; 

    inet_pton(AF_INET, HOST, &ipv4addr); 
    hp = gethostbyaddr(&ipv4addr, sizeof ipv4addr, AF_INET); 
    //hp = gethostbyname(HOST); 

    bcopy(hp->h_addr, &(server.sin_addr.s_addr), hp->h_length); 
    server.sin_port = htons(PORT); 

    connect(sd, (const sockaddr *)&server, sizeof(server)); 
    send(sd, (char *)message.c_str(), strlen((char *)message.c_str()), 0); 
} 

這是很基本的,是實際可行的。但是,它發送的是UDP數據包而不是TCP數據包,所以期望TCP的目標主機會拒絕這些數據包。另外,通過檢查連接/發送值以及使用ngrep觀看我的接口,我可以100%驗證數據包是否正在發送,所以這不是問題。

我只是想修改我擁有的東西,而不是用boost asio創建一個全功能的服務器。我怎樣才能調整它,使它在TCP而不是UDP方面運行?

+3

將'SOCK_DGRAM'改爲'SOCK_STREAM '。 (線索:UDP =用戶**數據報**協議)。 – BoBTFish 2013-05-10 16:08:00

+1

當然。謝謝。 – kmarks2 2013-05-10 16:12:24

回答

22

以下是你需要做出改變,通過TCP

傳輸數據
  1. 在創建。在例子中,你通過SOCK_DGRAM,而不是通過上面的SOCK_STREAM插座通正確的參數。

  2. 綁定服務器進入監聽模式後(請查看listen的手冊頁) ,而客戶端應該在套接字創建後連接。

  3. 然後在服務器端接聽後。

  4. 最後的讀取和寫入數據傳輸

    附加會給你的TCP連接的清晰畫面

    TCP Socket programming

    您可以檢查所有功能的詳細信息手冊頁

圖或者reeer beej的socket編程指南(使用this鏈接)