0

良い一日。

低レベルの C プログラミングを学んでいるコンピューター サイエンスの学生として、私はサーバーとクライアントの通信プログラムを作成するという「古典的な」演習に行き詰まっています。

目標は、リモート クライアント コンポーネントからコマンドを受け取り、それをローカル シェル コマンドとして実行するサーバー コンポーネントを開発することです。次に、コマンドの出力が再度クライアントに送信されます。ものすごく単純。

私のコードはクライアントからコマンドを送信し、サーバーはそれを正常に受信して実行し、出力をキャプチャします。しかし、この時点で、sayd サーバーがその出力をクライアントに返信しようとすると、何かがうまくいかず、クライアントは何も受信しません。問題がサーバー側にあるのか、クライアント側にあるのかはわかりません。

何か案が?前もって感謝します!

サーバ:

struct sockaddr_in srvaddr, cliaddr;
memset(&srvaddr, 0, sizeof(srvaddr));
memset(&cliaddr, 0, sizeof(cliaddr));

int sk = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

srvaddr.sin_family = AF_INET;
srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
srvaddr.sin_port = htons(42000);
bind(sk, (struct sockaddr*)&srvaddr, sizeof(srvaddr));
recvfrom(sk, recepcion, sizeof(recepcion), 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));

// [...] Portion of code with a Pipe pointing to a Fork which runs the command...

// And here is where, maybe, the communication is lost:
sendto(sk, recepcion, sizeof(recepcion), 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));

クライアント:

struct sockaddr_in srvaddr, cliaddr;

memset(&srvaddr, 0, sizeof(srvaddr));
memset(&cliaddr, 0, sizeof(cliaddr));

int sk = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

cliaddr.sin_family = AF_INET;
cliaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
cliaddr.sin_port = htons(42001);

srvaddr.sin_family = AF_INET;
srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
srvaddr.sin_port = htons(42000);

// [...] Some other code catching the command from the argument paramenters:

sendto(sk, comando, strlen(comando), 0, (struct sockaddr*)&srvaddr, sizeof(srvaddr));

// And here's where the server reply should be, but theres nothing:
recvfrom(sk, buff, sizeof(buff), 0, (struct sockaddr*)&srvaddr, sizeof(srvaddr));

fprintf(stderr, ""); ですべてのトレースを出力するとします。そのため、フォークによって端末のフォーカスが失われることは問題になりません。

さようなら、そしてありがとう!

4

1 に答える 1

0

問題はおそらくrecvfrom通話です。マニュアルページを確認すると、ソースアドレスの長さがポインタであることがわかります。エラーや警告なしでコンパイルする方法がわかりません。

サイズをソケットアドレス構造体の実際のサイズに初期化し、それにポインターを渡す必要があります。recvfrom関数は実際のサイズを埋めます。

socklen_t cliaddrlen = sizeof(cliaddr);
recvfrom(sk, recepcion, sizeof(recepcion), 0,
         (struct sockaddr *) &cliaddr, &cliaddrlen);

ああ、実際のコードのエラーをチェックすると思いますか?

于 2014-02-11T19:27:53.207 に答える