为套接字编程配置 OpenWrt 时出现问题

Problems in configuring OpenWrt for socket programming

本文关键字:问题 OpenWrt 套接字 编程 配置      更新时间:2023-10-16

我有一个代码,它从以太网接收数据包并通过无线网络发送。这适用于使用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 <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <netdb.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <sys/time.h>
#include <arpa/inet.h>  /* 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 startedn");
  char *tx_ip = BROADCAST_IP;
  unsigned short tx_port = BROADCAST_PORT;
  struct sockaddr_in tx_addr;
  printf("Variables initializedn");
  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 testn");
  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 providedn");
      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 packetsn");
      n = recvfrom(sock,buf,sizeof(v2vmessage),0,(struct sockaddr *)&from,&fromlen);
      if (n < 0)
        perror("recvfrom");
      printf("Packets receivedn");
      send_thread_body(buf);
      printf("Packets sentn");
    }
  }
  return 0;
}

main()中,将v2vmessage* buf替换为v2vmessage buf,在下面的while(1)中,将buf替换为&buf以解决问题。由于没有为指针分配内存,因此它在运行时给出了错误。

这是一个链接器错误,您确定您的链接器包含所有必需的库文件吗?我不熟悉 posix 套接字(至于要包含哪些标头以及要针对哪些库构建(,但我知道 sendto 是发送 UDP 数据包的调用,它可能会在那里失败。如果连接是 TCP,则使用 send((。希望这有帮助。

您缺少共享库。使用ldd(1)找出哪一个。您可能只需要设置LD_LIBRARY_PATH环境变量,请参阅ld.so(8)手册。