ソケットプログラミング用にOpenWrtを構成する際の問題

c++ g++ openwrt sockets
ソケットプログラミング用にOpenWrtを構成する際の問題

イーサネットからパケットを受信し、ワイヤレスネットワーク経由で送信するコードがあります。 これは、OpenWrtを使用するワイヤレスボックスで機能します。 コードは次のとおりです。 実行時に次のエラーが表示されます。 printfステートメントに基づいて、私はエラーがこの構文のどこかにあると感じていますが、何が間違っているのかわかりません。

エラーの可能性のある領域:

  if(sendto(b_sock, buf, sizeof(v2vmessage), 0, (struct sockaddr *)&tx_addr, sizeof(tx_addr)) < 0)

エラー:

Receving packets
Packets received
Sending packet started
Variables initialized
Send test
./dsrc_dsrc: can't resolve symbol 'sendto' in lib './dsrc_dsrc'.

コード:

#include
#include
#include
#include
#include
#include
#include
#include

#include
#include
#include
#include   /* for sockaddr_in */

#define BROADCAST_IP "192.168.255.255"
#define BROADCAST_PORT 4545

struct v2vmessage
{
  ...
  ...
};

int b_sock=-1;

void init_socket()
{
  unsigned short b_port = BROADCAST_PORT;
  struct sockaddr_in b_addr;
  int broadcastPermission;
  char* rx_ip = BROADCAST_IP;

  if ((b_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
    perror("socket() failed");

  /* Set socket to allow broadcast */
  broadcastPermission = 1;
  if (setsockopt(b_sock, SOL_SOCKET, SO_BROADCAST, (void *) &broadcastPermission, sizeof(broadcastPermission)) < 0)
    perror("setsockopt() failed");

  int opts;
  opts = fcntl(b_sock,F_GETFL);
  if(opts < 0)
    perror("fcntl get failed");

  opts = (opts | O_NONBLOCK);
  if(fcntl(b_sock,F_SETFL,opts) < 0)
    perror("fcntl set failed");

  memset(&b_addr, 0, sizeof(b_addr));   /* Zero out structure */
  b_addr.sin_family = AF_INET;                 /* Internet address family */
  b_addr.sin_addr.s_addr = inet_addr(rx_ip);/* Broadcast IP address */
  b_addr.sin_port = htons(b_port);         /* Broadcast port */

  if (bind(b_sock, (struct sockaddr *) &b_addr, sizeof(b_addr)) < 0)
    perror("rx bind() failed");
}


void send_thread_body(v2vmessage *buf)
{
  printf("Sending packet started\n");
  char *tx_ip = BROADCAST_IP;
  unsigned short tx_port = BROADCAST_PORT;
  struct sockaddr_in tx_addr;

  printf("Variables initialized\n");

  memset(&tx_addr, 0, sizeof(tx_addr));   /* Zero out structure */
  tx_addr.sin_family = AF_INET;                 /* Internet address family */
  tx_addr.sin_addr.s_addr = inet_addr(tx_ip);/* Broadcast IP address */
  tx_addr.sin_port = htons(tx_port);         /* Broadcast port */

  printf("Send test\n");

  if(sendto(b_sock, buf, sizeof(v2vmessage), 0, (struct sockaddr *)&tx_addr, sizeof(tx_addr)) < 0)
    perror("tx sent diff num bytes than expected");
}

int main(int argc, char *argv[])
{
  init_socket();
  {
    int sock, length, n,p;
    socklen_t fromlen;
    struct sockaddr_in server;
    struct sockaddr_in from;

    if (argc < 2)
    {
      fprintf(stderr, "ERROR, no port provided\n");
      exit(0);
    }

    sock=socket(AF_INET, SOCK_DGRAM, 0);
    if (sock < 0)
      perror("Opening socket");
    length = sizeof(server);
    bzero(&server,length);
    server.sin_family=AF_INET;
    server.sin_addr.s_addr=INADDR_ANY;
    server.sin_port=htons(atoi(argv[1]));
    if (bind(sock,(struct sockaddr *)&server,length)<0)
      perror("binding");
    fromlen = sizeof(struct sockaddr_in);
    v2vmessage *buf;

    while (1)
    {
      printf("Receving packets\n");
      n = recvfrom(sock,buf,sizeof(v2vmessage),0,(struct sockaddr *)&from,&fromlen);
      if (n < 0)
        perror("recvfrom");
      printf("Packets received\n");
      send_thread_body(buf);
      printf("Packets sent\n");
    }
  }
  return 0;
}

  0  0


ベストアンサー

「main()」で、「v2vmessage * buf」を「v2vmessage buf」に置き換え、次の「while(1)」で、「buf」を「&buf」に置き換えて問題を解決します。 ポインタにメモリが割り当てられていないため、実行時にエラーが発生しました。

1


これはリンカエラーです。リンカに必要なすべてのlibファイルが含まれていることを確認してください。 私はPOSIXソケットに精通していません(どのヘッダーを含めるか、ライブラリを構築するかについては)、sendtoはUDPパケットを送信するための呼び出しであり、そこで失敗する可能性があります。 接続がtcpの場合、send()が使用されます。 お役に立てれば。

0


共有ライブラリがありません。 http://www.kernel.org/doc/man-pages/online/pages/man1/ldd.1.html [ldd(1)]を使用して、どれを見つけます。 おそらく、 LD_LIBRARY_PATH`環境変数を設定する必要があるだけです。http://www.kernel.org/doc/man-pages/online/pages/man8/ld.so.8.html [ ld.so(8)を参照してください`]マニュアル。

0


タイトルとURLをコピーしました