1

私はubuntuでソケットプログラムを学んでおり、サーバークライアント通信用に次のプログラムを作成しました。プログラムはポートを開いていません。サーバークライアント通信に関して他にもいくつか質問があります。

  • サーバーがクライアント要求を受け入れると、サーバーは要求を受け入れた瞬間にクライアントからの読み取りを開始しますか?
  • u_connectとu_accept()によって返されるファイル記述子は同じですか?(ポートが開いていないため、見つかりませんでした)
  • 同じコンピューターでサーバークライアントトークをテストしているので、乱数をポートとして使用できますか?

ソケットプログラミング用のOS関数を含むラッパーライブラリを使用しています。

コードは次のとおりです。

Server.c

int main()
{
  char client[50];
  char buf[1024];
  u_port_t portnumber;
  portnumber = 4862;
  int fd = u_open(portnumber);
  int communFd = u_accept(fd, client, 50);
  printf("Opened com %d\n\n", communFd);
  fprintf(stderr, "\nComun fd is %d\n\n\n", communFd);
  read(communFd, buf, 1024);
  write(STDOUT_FILENO, buf, 1024);
  fprintf(stderr, "\n\nReading complete\n");
  return 0;
}

Client.c

int main()
{
  u_port_t portnumber;
  portnumber = 4862;
  char client[] = "Alfred";
  char buf[1024];
  int communFd = u_connect(portnumber, client);
  printf("comun is %d\n", communFd);
  read(STDIN_FILENO, buf, 1024);
  write(communFd, buf, 1024);
  return 0;
}
4

3 に答える 3

0

サーバーがクライアント要求を受け入れると、サーバーは要求を受け入れた瞬間にクライアントからの読み取りを開始しますか?

サーバーは、クライアントから(write()を介して)送信されたデータが受信され、ソケット読み取りバッファーで使用可能になったときに読み取ることができます。

u_connectとu_accept()によって返されるファイル記述子は同じですか?(ポートが開いていないため、見つかりませんでした)

いいえ。サーバー側とクライアント側が同じプロセスで実行されている場合でも、そうではありません。

同じコンピューターでサーバークライアントトークをテストしているので、乱数をポートとして使用できますか?

0〜65535のポートにバインドできます。0〜1024のポートが呼び出されknown ports、によって特定のサービスにすでに割り当てられていますIANA。私の提案は、49152〜65535の範囲のポート番号を使用することですが、低い値を使用することを禁止している人は誰もいません。

ポートが別のプロセスによってバインドされている場合、エラーコードが返されます。別のもので試してください

于 2013-01-28T13:40:09.563 に答える
0

これは間違っています。

read(communFd, buf, 1024);
write(STDOUT_FILENO, buf, 1024);

代わりにこれを行う必要があります。

ssize_t r;
size_t space_left = 1024
while ((r=read(communFd, buf, space_left))>0) {
    space_left-=r;
    write(STDOUT_FILENO,buf,r);
}

1回の書き込みで送信されるものは、ネットワークを介して断片化され、多くの読み取りで取得される可能性があるためです。

于 2013-01-28T13:48:43.050 に答える
0

まず、かなり古風な手法を使用しているため、そのラッパーを使用しないことをお勧めします。getaddrinfobindlistenrecvsendを読み、独自のPOSIXソケットコードを閉じてロールすることをお勧めします。あなたははるかに良い理解を得るでしょう。Beejのネットワークプログラミングガイドも読むことをお勧めします。たぶん、本が役に立つかもしれません...

  1. いいえ。read()関数はサーバーではなく読み取りを行います。その点で、read()の戻り値をどこかに格納し、それについて何が重要であるかを理解することをお勧めします。たちの多くのように、読むことは試行錯誤よりも効率的なメカニズムであるとあなたが信じるなら、これがマニュアルです。
  2. いいえ。u_openはサーバーソケットを返すように見えます。accept()は有効ですが、read()は有効なアクションではありません。u_acceptはピアソケットを返すように見えます。read()は有効ですが、accept()は有効なアクションではありません。
  3. 確かに、ポートが1024より大きく(通常1024未満にはスーパーユーザー権限が必要)、65535未満であり、ポートがまだバインドされていない場合。
于 2013-01-28T13:52:32.313 に答える