良い一日。
低レベルの 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, ""); ですべてのトレースを出力するとします。そのため、フォークによって端末のフォーカスが失われることは問題になりません。
さようなら、そしてありがとう!