Hello,may i ask some questions about Support SCTP in Android?
i have modified my kenerl Config file by "CONFIG_IP_SCTP=m" and "insmod
sctp.ko" is success .
i hava done some simple client/server console application , but the function
"connect" always failed by "Connection timed out" .The client and server
concole application works well on my ubuntu host machine,but when i
Cross-compile it to run on Android emulator , it won't mork well , the
client request server_addr "127.0.0.1" , use port 9999 , the server listen
on port 9999 , but the connection won't been established . Can anyone tell
me what should i do ? Thank you .
And i did't integrated lksctp tools in android , can anyone tell me
how to integrated
it?
The mail attachment is the code of my test concole application.
My English is poor , please forgive that .
Please help me . Thank you .
--
unsubscribe: [email protected]
website: http://groups.google.com/group/android-porting
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
//#include <netinet/sctp.h>
#include <arpa/inet.h>
#include "sctp.h"
#define MAX_BUFFER 1024
#define MY_PORT_NUM 9999
int main()
{
int cfd;
int ret,in,flags;
char buffer[MAX_BUFFER+1];
struct sockaddr_in sersddr;
struct sctp_event_subscribe events;
struct sctp_initmsg initmsg;
struct sctp_status status;
struct sctp_sndrcvinfo sndrcvinfo;
cfd = socket( AF_INET, SOCK_STREAM, IPPROTO_SCTP);
printf("Client : socket fd = %d\n",cfd);
if ( cfd == -1 )
{
perror( "Socket error!" );
exit(1);
}
bzero( &initmsg, sizeof(initmsg) );
memset( &initmsg, 0, sizeof(initmsg) );
initmsg.sinit_num_ostreams = 5;
initmsg.sinit_max_instreams = 5;
initmsg.sinit_max_attempts = 4;
ret = setsockopt( cfd, IPPROTO_SCTP, SCTP_INITMSG, (void *)&initmsg, (socklen_t)sizeof(initmsg));
if (ret < 0)
{
perror( "Setsockopt SCTP_INITMSG error!" );
exit(1);
}
printf("Client : setsockopt return value : %d\n",ret);
bzero( &sersddr, sizeof(sersddr));
sersddr.sin_family = AF_INET;
sersddr.sin_port = htons (MY_PORT_NUM);
sersddr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
printf("Client : trying to connect...\n");
ret = connect( cfd, (struct sockaddr *)&sersddr, sizeof(sersddr));
if (ret == -1)
{
perror( "Bind error" );
exit(1);
}
printf("Client : connect success.\n");
bzero( &events, sizeof(events));
memset( (void *)&events, 0, sizeof(events) );
events.sctp_data_io_event = 1;
ret = setsockopt( cfd, IPPROTO_SCTP, SCTP_EVENTS, (void *)&events, (socklen_t)sizeof(events));
if (ret < 0)
{
perror( "Setsockopt SCTP_EVENTS error!" );
exit(1);
}
in = sizeof(status);
ret = getsockopt( cfd, IPPROTO_SCTP, SCTP_STATUS, (void *)&status, (socklen_t*)&in);
if (ret < 0)
{
perror( "Getsockopt SCTP_STATUS error!" );
exit(1);
}
ret = sctp_recvmsg( cfd, (void *)&buffer, sizeof(buffer), NULL, 0, &sndrcvinfo, &flags);
if (ret > 0)
{
buffer[ret] = 0;
printf( "%s\n", buffer );
printf( "All rigth!\n" );
}
close( cfd );
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
//#include <netinet/sctp.h>
#include "sctp.h"
#define MAX_BUFFER 1024
#define MY_PORT_NUM 9999
#define LISTEN_LEN 5
int main()
{
int lsd,asd;
int ret;
int stream_num = 1;
time_t currenttime;
char buffer[MAX_BUFFER+1];
struct sockaddr_in seraddr;
struct sctp_initmsg initmsg;
lsd = socket( AF_INET, SOCK_STREAM, IPPROTO_SCTP );
printf("Server : socket fd = %d\n",lsd);
if (lsd == -1)
{
perror( "Socket error!" );
exit(1);
}
bzero( &seraddr, sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons( MY_PORT_NUM );
seraddr.sin_addr.s_addr = INADDR_ANY;
ret = bind( lsd, (struct sockaddr *)&seraddr, sizeof(seraddr));
if (ret == -1)
{
perror( "Bind error!" );
exit(1);
}
printf("Server : bind return value : %d\n",ret);
bzero( &initmsg, sizeof(initmsg));
initmsg.sinit_num_ostreams = 5;
initmsg.sinit_max_instreams = 5;
initmsg.sinit_max_attempts = 5;
ret = setsockopt( lsd, IPPROTO_SCTP, SCTP_INITMSG, &initmsg, sizeof(initmsg));
if (ret < 0)
{
perror( "Setsockopt SCTP_INITMAG error!" );
exit(1);
}
printf("Server : setsockopt return value : %d\n",ret);
ret = listen( lsd, LISTEN_LEN);
if (ret == -1)
{
perror( "Listen error!" );
exit(1);
}
while (1)
{
printf( "Waiting for a new association\n" );
asd = accept( lsd, (struct sockaddr *)NULL, (int *)NULL);
if (asd == -1)
{
perror( "Accept error!" );
exit(1);
}
printf("connection established\n");
currenttime = time( NULL );
snprintf( buffer, MAX_BUFFER, "%s", ctime( ¤ttime ));
sctp_sendmsg( asd, (void *)buffer, (size_t)strlen(buffer), NULL, 0, 0, 0, stream_num, 0, 0);
close(asd);
}
close(lsd);
return 0;
}