1

関連する質問がすでに回答されていることは知っていますが、問題を解決できませんでした。

シンプルな UDP クライアント サーバー アプリがあります。クライアントとサーバーはどちらも問題ないように見えますが、サーバーはクライアントからパケットを受信せず、ネット ID 192 を無限に受信するだけです (または、クライアントがパッケージを正しく送信していない可能性があります)。

問題を理解できないようです。アドレスとポートはどちらも問題ありません。ファイアウォールはありません。念のため、ポートの例外も追加しました。サーバーを起動すると、正しいポート (netstat -a -s -p udp) で正常にリッスンしていることがわかります。何が悪いのかヒントを教えてください。

ここに私のサーバーコードがあります:

/*.. includes */
#define PORT 8888
#define NPACK 10
#define MAXLEN 100

void signalError(char* s){
    perror(s);    
    exit(1);
}

int main()
{
struct sockaddr_in struct_srv, struct_client;
int s,i,cod, numbytes;
size_t clientSize;
int32_t nr;
int32_t sir1[MAXLEN], sir2[MAXLEN], sirComune[MAXLEN], nrEl1, nrEl2, nrComune;

//Creating the socket:
s = socket(PF_INET, SOCK_DGRAM, 0);
if(s==-1) signalError("Error while creating socket!");

memset(&struct_srv, 0, sizeof(struct_srv));
struct_srv.sin_family = AF_INET;
struct_srv.sin_addr.s_addr = htonl(INADDR_ANY);
struct_srv.sin_port = htons(PORT);  

s = bind(s, (struct sockaddr*) &struct_srv, sizeof(struct_srv));
if(s==-1) signalError("Bind error. Port is already in use!");

//receive packets:    
nrEl1 = -1;

char buf[MAXLEN];
printf("Accepting packets:\n");
//for(i=0;i<NPACK;i++) {
for(;;) {
     //Receive packets from client:
    clientSize = sizeof(struct_client);        
    numbytes = recvfrom(s, buf, MAXLEN - 1, 0,
                (struct sockaddr*) &struct_client, &clientSize);
    buf[numbytes] = '\0';

    printf("Packet is %d long.\n", numbytes);
    printf("Packet contains %s:\n", buf);       
    sleep(3);
}

close(s);
return 0;
}

そして私のクライアントコード:

/* includes */
#define SRV_IP "127.0.0.1"
#define NPACK 100
#define MAXLEN 100
#define PORT 8888

void signalError(char* s){
    perror(s);
    exit(1);
}

int main(void)
{
struct sockaddr_in struct_client;
int s, i, result, size_client = sizeof(struct_client);
int32_t nr, sir1[MAXLEN], sir2[MAXLEN];

s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s==-1) signalError("Erorr creating socket!");

memset((char*) &struct_client, 0, sizeof(struct_client));
struct_client.sin_family = AF_INET;
struct_client.sin_addr.s_addr = htonl(INADDR_ANY);
struct_client.sin_port = htons(PORT);
if(inet_aton(SRV_IP, &struct_client.sin_addr)==0) {
    fprintf(stderr, "inet_aton() failed\n");
    exit(1);
}

char buf[MAXLEN];
int len;
for(i=0;i<NPACK;i++) {    
    printf("Give packet %d:\n", i+1);       
    fgets(buf, sizeof(buf), stdin);
    buf[strlen(buf)-1] = '\0';
    printf("I've read %s\n", buf);
    printf("Sending packet %d\n", i+1);
    result = sendto(s, buf, sizeof(buf)+1, 0,
            (struct sockaddr*) &struct_client, size_client);
    if(result==-1) signalError("Error sending packets!");        
}

close(s);
return 0;
}
4

3 に答える 3

2

ここにいくつかの小さな点があります:

  1. サーバーでは、へのsize_client = sizeof(struct_client)すべての呼び出しの前に設定しrecvfromます。これは入力パラメーターと出力パラメーターの両方であるため、1 つの呼び出しからの出力が次の呼び出しへの入力に干渉しないようにする必要があります。
  2. 境界を越えてメモリを読み取れないように、必ずbuftoの最後のバイトを設定してください。'\0'printf
  3. とはcod? それはどこから来たのか?テストするつもりだったと思いますnumbytes
  4. 設定buf[strlen(buf) - 1] = '\0'すると、バッファの最後の文字が切り取られます。それはあなたがやろうとしていたことですか?

そして、それが機能しない主な理由:

を初期化nrしたことがないため、 sendto が何を送信しているのかわかりません。それは確かに送信されていませんbuf。これはあなたが望んでいたものだと思います...おそらくこれが必要です:

sendto(s, buf, sizeof(buf), ...)
于 2011-03-18T13:59:48.823 に答える
1

私が抜本的な何かを見逃していない限り、あなたはここにゴミを送っているだけです.

nrコメントを除いて、送信側で初期化されることはありません。 bufは初期化されていますが、どこにも使用されていません。

sendtoパーツを次のように変更してみてください。

result = sendto(s, buf, strlen(buf)+1, 0,
        (struct sockaddr*) &struct_client, size_client);
于 2011-03-18T13:55:52.833 に答える
0

クライアント コードではnr、ネット経由で送信される変数は初期化されておらず、任意のものを指すことができます。buf代わりに配列を送信することをお勧めします。

于 2011-03-18T13:55:13.410 に答える