2013-05-10 9 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); 
} 

。しかし、TCPパケットの代わりにUDPパケットを送信しているので、TCPを予期しているターゲットホストはこれらを拒否します。また、connect/sendの値を調べ、ngrepを使って私のインターフェースを見れば、パケットが出ていることを100%確認できるので、それは問題ではありません。

私は自分が持っているものを変更することに興味があり、ブーストasioを備えたフル機能のサーバーを作成しません。これを調整してUDPの代わりにTCPの面で動作させるにはどうすればよいですか?

+3

'SOCK_DGRAM'を' SOCK_STREAM '。 (手掛かり:UDP =ユーザ**データグラム**プロトコル)。 – BoBTFish

+1

もちろん。ありがとう。 – kmarks2

答えて

22

はあなたがSOCK_DGRAMではなく、SOCK_STREAMを渡す渡さ上記の例.INソケットパス正しいパラメータを作成している間、TCP

  1. を介してデータを転送するようにする必要があり、変更されています。

  2. バインド後のサーバーは、ソケット作成後にクライアント側で接続する必要がありますが、バインド後のサーバーはリッスンモード(listenのマニュアルページを参照)にしてください。

  3. その後、受信した後にサーバー側で受け入れます。

  4. 決勝読むと、あなたはすべての機能に関する詳細な情報のためのマニュアルページを確認することができます添付図はあなたにTCPコネクション

    TCP Socket programming

    の鮮明な画像が得られます

データを転送するために書きますソケットプログラミングのためのbeejのガイドを参照してください(thisリンクを使用してください)

関連する問題