私はどこでも答えを探しています。私はC言語でコーディングするのが初めてで、教授が私たちに言語を選択させてもらえればそれを愛していたでしょうが、私は逃げ出します。私はOracle V-Boxをローカルで実行していて、UbuntuクライアントとUbuntuサーバーを実行しています。以下のコードをサーバーとクライアントの両方でコンパイルし、いくつかの警告を出します。私はサーバー上でコードを実行して(うまくいくように見える)、クライアント上で実行します。クライアントは、TCPソケット転送(これはうまくいった)と同じように、PDFファイルを送信するよう求めています。また、クライアントとサーバーでWiresharkを実行していますが、要求がクライアントから送信されたように見えますが、サーバーは何もせず、ファイルを引っ張らずに両端に座っています。それがコードなのかどうかは分かりません。UDPクライアント/サーバーc
/* Echo server using UDP */
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SERVER_UDP_PORT 2466
#define MAXLEN 4096
int main(int argc, char **argv)
{
int sd, client_len, port, n;
char buf[MAXLEN];
struct sockaddr_in server, client;
switch(argc) {
case 1:
port = SERVER_UDP_PORT;
break;
case 2:
port = atoi(argv[1]);
break;
default:
fprintf(stderr, "Usage: %s [port]\n", argv[0]);
exit(1);
}
/* Create a datagram socket */
if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
fprintf(stderr, "Can't create a socket\n");
exit(1);
}
/* Bind an address to the socket */
bzero((char *)&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sd, (struct sockaddr *)&server,
sizeof(server)) == -1) {
fprintf(stderr, "Can't bind name to socket\n");
exit(1);
}
while (1) {
client_len = sizeof(client);
if ((n = recvfrom(sd, buf, MAXLEN, 0,
(struct sockaddr *)&client, &client_len)) < 0) {
fprintf(stderr, "Can't receive datagram\n");
exit(1);
}
if (sendto(sd, buf, n, 0,
(struct sockaddr *)&client, client_len) != n) {
fprintf(stderr, "Can't send datagram\n");
exit(1);
}
}
close(sd);
return(0);
}
私は通常、サーバー上のコードを実行しコンパイルしたら、これはクライアントコード
// UDP Echo Client
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SERVER_UDP_PORT 2466
#define MAXLEN 4096
#define DEFLEN 64
long delay(struct timeval t1, struct timeval t2)
{
long d;
d = (t2.tv_sec - t1.tv_sec) * 1000;
d += ((t2.tv_usec - t1.tv_usec + 500)/1000);
return(d);
}
int main(int argc, char **argv)
{
int data_size = DEFLEN, port = SERVER_UDP_PORT;
int i, j, sd, server_len;
char *pname, *host, rbuf[MAXLEN], sbuf[MAXLEN];
struct hostent *hp;
struct sockaddr_in server;
struct timeval start, end;
unsigned long address;
pname = argv[0];
argc--;
argv++;
if (argc > 0 && (strcmp(*argv, "-s") == 0)) {
if (--argc > 0 && (data_size = atoi(*++argv))) {
argc--;
argv++;
}
else {
fprintf(stderr,
"Usage: %s [-s data_size] host [port]\n", pname);
exit(1);
}
}
if (argc > 0) {
host = *argv;
if (--argc > 0)
port = atoi(*++argv);
}
else {
fprintf(stderr,
"Usage: %s [-s data_size] host [port]\n", pname);
exit(1);
}
if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
fprintf(stderr, "Can't create a socket\n");
exit(1);
}
bzero((char *)&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(port);
if ((hp = gethostbyname(host)) == NULL) {
fprintf(stderr, "Can't get server's IP address\n");
exit(1);
}
bcopy(hp->h_addr, (char *) &server.sin_addr, hp->h_length);
if (data_size > MAXLEN) {
fprintf(stderr, "Data is too big\n");
exit(1);
}
for (i = 0; i < data_size; i++) {
j = (i < 26) ? i : i % 26;
sbuf[i] = 'a' + j;
} // construct data to send to the server
gettimeofday(&start, NULL); /* start delay measurement */
server_len = sizeof(server);
if (sendto(sd, sbuf, data_size, 0, (struct sockaddr *)
&server, server_len) == -1) {
fprintf(stderr, "sendto error\n");
exit(1);
}
if (recvfrom(sd, rbuf, MAXLEN, 0, (struct sockaddr *)
&server, &server_len) < 0) {
fprintf(stderr, "recvfrom error\n");
exit(1);
}
gettimeofday(&end, NULL); /* end delay measurement */
if (strncmp(sbuf, rbuf, data_size) != 0)
printf("Data is corrupted\n");
close(sd);
return(0);
}
です:
./udp_server
だけがクライアントから待って座っています。私は、クライアント上でコードを実行してコンパイルすると
:
./udp_client -s 1500 10.0.2.11 2466 > test.pdf
私は
((出力は、クライアントのデスクトップ)に./udp_client -s DATA_RATE SERVER_IP SERVER_PORT>ファイルに)され、これを実行しますこれは単に空白のページを生成します。それはテキストと写真の数ページを持っている必要があります。
私はWiresharkのクライアントから送信していますが、サーバーからの返信はありません。
これは私がターミナル
'strace'の下でサーバを実行してください。これは膨大な量のゴブリンジクを生み出します。ターミナルで噴出が止まるまで待ちます。その後、control-Cを打つことなく、最後の10行から15行のgobbledygook(UNEDITED)をコピーして過去の質問に貼り付けます。次に、送信側のクライアントを実行します。そのため、サーバが動作しているターミナルウィンドウに何かが表示される場合は、それをコピーして質問にも貼り付けてください。 – zwol
デバッガでサーバーを実行しようとしましたが、パケットを受信していますか? – Barmar
サーバでWiresharkを実行して、パケットを受信しているかどうかを確認します。 – Barmar