为套接字编程配置 OpenWrt 时出现问题
Problems in configuring OpenWrt for socket programming
我有一个代码,它从以太网接收数据包并通过无线网络发送。这适用于使用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)
手册。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++:ifstream getline 问题交叉编译到 OpenWRT 发行版中
- 为套接字编程配置 OpenWrt 时出现问题