24

私は初心者の C++ プログラマー/ネットワーク管理者ですが、誰かが私を正しい方向に向ければ、これを行う方法を学ぶことができると思います。ほとんどのチュートリアルは、何らかの理由で機能しなくなった古いコードを使用して示されています。

私は Linux を使っているので、生の Berkeley ソケットの書き方を説明するだけで十分です。誰かが私に簡単な概要を教えてもらえますか?

4

12 に答える 12

14

ソケットプログラミングに関するBeejのガイドを読むことから始めます。ネットワーク コードの記述を開始する方法について説明します。その後、man ページを読むことで、より多くの情報を取得できるようになるはずです。

そのほとんどは、お気に入りのライブラリのドキュメントを読むことと、man ページの基本的な理解で構成されます。

于 2008-09-16T23:05:19.613 に答える
11

まず、「生」の意味を明確にしていただけると助かります。伝統的に、これはレイヤー 4 ヘッダー (TCP/UDP/ICMP... ヘッダー) のすべてと、場合によっては IP ヘッダーの一部を独自に作成する必要があることを意味します。これには、すでにここで多く言及されている beej のチュートリアル以上のものが必要です。この場合、socket への呼び出しで SOCK_RAW 引数を使用して生の IP ソケットを取得する必要があります (いくつかの基本については、 http://mixter.void.ru/rawip.htmlを参照してください)。

本当に必要なのは、stackoverflow.com のポート 80 などのリモート ホストへの TCP 接続を確立できることだけである場合は、おそらく「生の」ソケットは必要なく、beej のガイドが役立ちます。

この件に関する信頼できる参考文献として、Stevens らによる Unix Network Programming, Volume 1: The Sockets Networking API (3rd Edition) を実際に取り上げる必要があります。

于 2008-09-16T23:19:59.547 に答える
5

TCP クライアント側の場合:

gethostbyname を使用して DNS 名を IP で検索すると、hostent 構造が返されます。この戻り値をホストと呼びましょう。

hostent *host = gethostbyname(HOSTNAME_CSTR);

ソケット アドレス構造を入力します。

sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = htons(REMOTE_PORT);
sock.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;

ソケットを作成し、connect を呼び出します。

s = socket(AF_INET, SOCK_STREAM, 0); 
connect(s, (struct sockaddr *)&sock, sizeof(sock))

TCP サーバー側の場合:

ソケットをセットアップする

bind を使用してアドレスをそのソケットにバインドします。

listen でそのソケットでリッスンを開始します

接続されたクライアントを取得するには、accept を呼び出します。<-- この時点で、接続を処理するための新しいスレッドを生成し、次に接続されたクライアントを取得するために別の呼び出しを受け入れて受け入れます。

一般的なコミュニケーション:

send と recv を使用して、クライアントとサーバーの間で読み取りと書き込みを行います。

BSD ソケットのソース コード例:

wikipediaで、これの良いサンプル コードを見つけることができます。

参考文献:

この本オンライン チュートリアルを強くお勧めします。

代替テキスト

4 :

于 2008-09-16T23:13:20.920 に答える
4

開始するには、ネットワーク通信用の優れたクロスプラットフォーム (Linux を含む) ライブラリであるAsioを使用することをお勧めします。

于 2008-09-16T23:05:01.627 に答える
3

私は過去 1 年間libtinsを開発してきました。高レベルの C++ パケット クラフトおよびスニッフィング ライブラリです。

車輪を再発明してすべてのプロトコルの内部を実装したい場合を除き、既にそれを行っている高レベルのライブラリを使用することをお勧めします。

于 2013-02-07T13:30:58.980 に答える
3

これは、通常の C で行うのとまったく同じ方法で行います。標準ライブラリでこれを行う C++ 固有の方法はありません。

これを学習するために使用したチュートリアルはhttp://beej.us/guide/bgnet/です。これは、見回して見つけた最高のチュートリアルでした。明確な例と、説明されているすべての機能の適切な説明がありました。

于 2008-09-16T23:07:04.680 に答える
1

Libpcapを使用すると、完全なパケット (レイヤー 2 からレイヤー 7) を作成し、それらをネットワーク経由で送信できます。楽しそうに聞こえますが、いくつか注意点があります。適切なヘッダーをすべて作成し、すべてのチェックサムを自分で行う必要があります。 ただし、 Libnetはそれを助けることができます。

C++ プログラミング プールから抜け出したい場合は、python 用のscapyがあります。これにより、TCP/IP パケットの作成と送信が簡単になります。

于 2009-02-27T16:38:17.243 に答える
1

ポスター、あなたの質問を明確にしてください。

ほとんどすべての応答は、ソケットのチュートリアルを求めていると考えているようです。あなたの質問を読んで、任意の IP パケットを送信できる raw ソケットを作成する必要があることを意味しています。以前の回答で述べたように、一部の OS では raw ソケットの使用が制限されています。

http://linux.die.net/man/7/raw "有効なユーザー ID が 0 または CAP_NET_RAW 機能を持つプロセスのみが raw ソケットを開くことができます。"

于 2008-09-16T23:16:26.887 に答える
1

これに関する参考文献はたくさんありますが (もちろん、Stevens の本が思い浮かびます)、Beej ガイドは、始めるのに非常に役立つことがわかりました。実際に何が起こっているのかを理解できるほど内容が充実していますが、'hello world' udp クライアント/サーバーを作成するのに数日もかからないほど単純です。

于 2008-09-16T23:05:36.103 に答える
1

簡単:

#include <sys/socket.h>
#include <sys/types.h>

int socket(int protocolFamily, int Type, int Protocol)
// returns a socket descriptor

int bind(int socketDescriptor, struct sockaddr* localAddress, unsigned int addressLength)
// returns 0 

...等。

それはすべてsys/socket.hにあります

于 2008-09-16T23:06:11.203 に答える
1

Richard Stevens によるUnix Network Programmingを読んでください。それは絶対必要です。すべてがどのように機能するかを説明し、コードを提供し、さらにヘルパー メソッドも提供します。彼の他の本のいくつかをチェックしたいかもしれません。 Unix環境での高度なプログラミングは、Unixでの低レベルのプログラミングが一般的であるための必需品です。私はもう Unix スタックで何かをすることさえしていません。

于 2008-09-16T23:30:47.087 に答える