以下は、私が思いついた次の基本的なソケットコードです。
//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%確認できるため、問題ではありません。
私は、ブーストasioでフル機能のサーバーを作成するのではなく、自分が持っているものを変更することにのみ興味があります。 UDPの代わりにTCPの観点から動作するようにこれを微調整するにはどうすればよいですか?
以下は、TCP経由でデータを転送するために必要な変更です。
ソケットの作成時に正しいパラメーターを渡します。上記の例では、SOCK_STREAMを渡す代わりにSOCK_DGRAMを渡しました。
サーバーがリッスンモードになったら(リッスンのマニュアルページを確認してください)、クライアント側はソケットの作成後に接続する必要があります。
次に、リッスン後にサーバー側で受け入れます。
データを転送するための最終読み取りおよび書き込み
添付の図は、TCP接続の明確な画像を提供します
すべての機能の詳細についてはマニュアルページを確認するか、ソケットプログラミングについてbeejのガイドを参照してください( this linkを使用)