2011-06-01 22 views
0

我有一個代碼,它接收來自以太網的數據包並通過無線網絡發送它。這適用於使用OpenWrt的無線盒子。代碼寫在下面。它在運行時給我下面的錯誤。基於printf語句,我覺得錯誤在這個語法的某個地方,但我無法弄清楚什麼是錯的。錯誤的爲套接字編程配置OpenWrt的問題

可能的區域:

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 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; 
} 

回答

1

main(),取代v2vmessage* buf通過v2vmessage buf並且在以下while(1),通過&buf更換buf來解決這個問題。因爲沒有內存分配給指針,所以它在運行時給出錯誤。

0

這是一個鏈接錯誤,你確定你的鏈接器,包括所有必需的lib文件?我不熟悉posix套接字(只要包含哪些頭文件和哪些庫可以構建),但我知道sendto是發送UDP數據包的調用,並且可能會失敗。如果連接是tcp,則使用send()。希望這可以幫助。

+0

它是UDP端口4545上的192.168.255.255廣播。如果有鏈接器錯誤,那麼它應該在編譯期間鏈接它們時發出錯誤,但它不會給我任何這樣的錯誤。因此,我假設它需要的所有庫都可用。無論如何感謝您的幫助。 :-) – 2011-06-01 16:13:58

+0

我找到了解決方案。在main()中,用v2vmessage buf替換v2vmessage * buf,在下面的while(1)中,用&buf替換buf解決了這個問題。我不知道這是如何解決問題的,但它不知何故。 – 2011-06-01 16:33:18

0

您缺少共享庫。使用ldd(1)找出哪一個。您可能只需設置LD_LIBRARY_PATH環境變量,請參見ld.so(8)手冊。

+0

不,問題不在ldd中。我找到了解決方案。在main()中,用v2vmessage buf替換v2vmessage * buf,在下面的while(1)中,用&buf替換buf解決了這個問題。我不知道這是如何解決問題的,但它不知何故。無論如何,感謝您的幫助和答覆。 :-D – 2011-06-01 16:32:20

+0

您應該以更高的警告級別進行編譯 - 您可能會較早使用未聲明的函數。 – 2011-06-01 16:55:31

+0

是的。感謝您的意見。 – 2011-06-01 18:36:52