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( &currenttime ));
      sctp_sendmsg( asd, (void *)buffer, (size_t)strlen(buffer), NULL, 0, 0, 0, stream_num, 0, 0);
   
      close(asd);
   }

   close(lsd);
   return 0;
}

Reply via email to