Hello, Android Developers
I programmed a udpserver sample program wich Android NDK (version
android-ndk-r4b).
When, I call recvfrom function, but "struct sockaddr *addr" parameter
returns NULL value.
This is output of below sample code..
./udpserver
read from 0.0.0.0:0 ..
It works well when I was static compile with GNU libc without Bionic-C
libc.
Anybody solved this problem ?
==================================================================================
Sample code is:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <time.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/select.h>
#include <sys/select.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#if 1
#define DEBUG(x, args ...) printf(x, ## args)
#else
#define DEBUG(x, args ...)
#endif
/*---------------------------------------------------------------------
*/
int udp_open(int port);
int udp_close(int socket_no);
int udp_write(int socket_no, char *str, int len, struct sockaddr
*addr);
int udp_read(int socket_no, char *str, int len, struct sockaddr
*addr);
/*---------------------------------------------------------------------
*/
int udp_open(int port)
{
struct sockaddr_in srv_addr;
int socket_no, ret;
unsigned char opt;
if((socket_no=socket(AF_INET, SOCK_DGRAM, 0)) < 0) return -1;
opt = 1;
setsockopt(socket_no, SOL_SOCKET, SO_BROADCAST, (const void *)&opt,
sizeof(opt));
memset(&srv_addr, 0, sizeof(struct sockaddr_in));
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(port);
srv_addr.sin_addr.s_addr = INADDR_ANY;
ret = bind(socket_no, (struct sockaddr *)&srv_addr,
sizeof(srv_addr));
if(ret<0) return -1;
return(socket_no);
}
/*---------------------------------------------------------------------
*/
int udp_close(int socket_no)
{
return close(socket_no);
}
/*---------------------------------------------------------------------
*/
int udp_write(int socket_no, char *str, int len, struct sockaddr
*addr)
{
int ret;
int i=0;
while(1)
{
ret = sendto(socket_no, &str[i], len-i, 0, addr, sizeof(struct
sockaddr));
i+=ret;
if((i>=len)||(ret<0)) break;
}
if(ret<0) return -1;
return ret;
}
/*---------------------------------------------------------------------
*/
int udp_read(int socket_no, char *str, int len, struct sockaddr
*addr)
{
int read;
return recvfrom(socket_no, str, len, 0, addr, &read);
}
/*---------------------------------------------------------------------
*/
int main(int argc, char *argv[])
{
int sock;
struct sockaddr_in addr;
fd_set rfds;
struct timeval tv;
char buffer[1024];
int len, ret;
if((sock = udp_open(12345)) < 0)
{
DEBUG("Socket(%d) Open Fail.\n", 12345);
return 0;
}
while(1)
{
FD_ZERO(&rfds);
FD_SET(sock, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
if((ret = select(sock+1, &rfds, NULL, NULL, &tv)) < 0)
break;
if(ret > 0)
{
if( FD_ISSET(sock, &rfds) )
{
len = udp_read(sock, buffer, 1024, (struct
sockaddr *)&addr);
buffer[len] = 0;
DEBUG("read from %s:%d .. \n",
inet_ntoa(addr.sin_addr),
ntohs(addr.sin_port));
}
}
else
{
// timeout ...
}
}
udp_close(sock);
return 0;
}
==================================================================================
Makefile :
TARGET = udpserver
ANDROID_NDK_PATH=/home/hisona/android-ndk-r4b
CROSS = $(ANDROID_NDK_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/
bin/arm-eabi-
INCDIR = $(ANDROID_NDK_PATH)/build/platforms/android-8/arch-arm/usr/
include
LIBDIR = $(ANDROID_NDK_PATH)/build/platforms/android-8/arch-arm/usr/
lib
CC = $(CROSS)gcc
AR = $(CROSS)ar
LD = $(CROSS)ld
NM = $(CROSS)nm
RANLIB = $(CROSS)ranlib
STRIP = $(CROSS)strip
INCLUDE = -I. -I$(INCDIR)
CFLAGS = -Wall
LDFLAGS = -nostdlib -Wl,--dynamic-linker,"/system/bin/linker" -L$
(LIBDIR) -lc -lm -lstdc++ -ldl
# crt
CRTOBJ = $(LIBDIR)/crtbegin_dynamic.o
# application file
APPSOURCES = main.c
APPOBJS = $(APPSOURCES:.c=.o)
# define the rule
.SUFFIXES:.c .o
.c.o:
@echo Compiling: $<
$(CC) -c $(CFLAGS) $(INCLUDE) -o $@ $<
all: app
app: $(APPOBJS)
@echo Linking: $(TARGET)
$(CC) -o $(TARGET) $(APPOBJS) $(CRTOBJ) $(LDFLAGS)
$(STRIP) -s $(TARGET)
clean:
@rm -vf $(APPOBJS) $(TARGET)
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en