0

サーバーに情報を送信し、サーバーのターミナルウィンドウに出力するLinuxのposixソケットAPIを使用して、cでクライアントアプリケーションを作成しました。サーバーがクライアントと同じマシン上にあり、クライアントがループバックまたは独自の IP アドレスに送信する場合、すべて問題ありません。ただし、サーバーが別のマシンで実行されている場合、sendto は「引数が無効です」というエラーを返します。

クライアント アプリケーションのコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include "utils.h"   // for 'errexit()'


#define PEER_PORT 54321
#define BUFFSIZE 100
#define local_net_ip "192.168.0.10"

int main( int argc, char *argv[] )
{

  int clientfd;

  clientfd = socket( AF_INET, SOCK_DGRAM, 0 );
  if( clientfd == -1 )
    errexit( "socket()" );

  struct sockaddr_in servaddr;
  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons( PEER_PORT );
  if( inet_pton( AF_INET, local_net_ip, (void *) &(servaddr.sin_addr) ) == -1 )
    errexit( "inet_pton()" );

  char addrStr[ INET_ADDRSTRLEN ];
  inet_ntop( servaddr.sin_family, &(servaddr.sin_addr), addrStr, INET_ADDRSTRLEN );
  printf("Server IPv4 addr:  [ %s ]\n", addrStr);

  char buff[ BUFFSIZE ];
  int writebytes;
  for( ;; ) {

    printf( "Enter text:  ");
    fgets( buff, BUFFSIZE, stdin );

    writebytes = sendto( clientfd, buff, BUFFSIZE, 0, (struct sockaddr *) &servaddr,         sizeof( struct sockaddr_in ) );
    if( writebytes == -1 )
      errexit( "sendto()" );

  }


  exit( EXIT_SUCCESS );

}

アプリケーションが別のコンピューターに送信されない理由についての情報をいただければ幸いです。前もって感謝します!!

4

1 に答える 1

1

clientfd = socket( AF_INET, SOCK_DGRAM, 0 );

IP などのプロトコル 0 でソケットを作成しています。ただし、後で IP:Port をターゲットとして使用します。おそらく、ここで UDP ソケットを使用したかったでしょう (proto 17)。

于 2014-03-04T05:31:04.963 に答える