18

以下は、私が思いついた次の基本的なソケットコードです。

//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 を期待しているターゲット ホストはこれらを拒否します。また、接続/送信値を検査し、ngrep を使用してインターフェイスを監視することで、パケットが送信されていることを 100% 確認できるので、それは問題ではありません。

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

4

2 に答える 2

25

以下は、TCP 経由でデータを転送するために必要な変更です。

  1. ソケットの作成中に正しいパラメーターを渡します。上記の例では、SOCK_STREAM を渡す代わりに SOCK_DGRAM を渡しました。

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

  3. 次に、リッスン後にサーバー側で受け入れます。

  4. データを転送するための最終的な読み取りと書き込み

添付の図は、TCP 接続の明確な図を示します

TCP ソケットのプログラミング

すべての機能の詳細についてはマニュアル ページを確認するか、ソケット プログラミングについては beej のガイドを参照してください (このリンクを使用してください) 。

于 2013-05-10T16:13:51.957 に答える
9

に置き換えSOCK_DGRAMますSOCK_STREAM

また、マニュアルを読むか、良い本を入手してください。

于 2013-05-10T16:06:40.190 に答える