#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include #include #include #include #include #include #include #include MODULE = Net::SIGTRAN::SCTP PACKAGE = Net::SIGTRAN::SCTP int _socket() CODE: RETVAL = socket( AF_INET, SOCK_STREAM, IPPROTO_SCTP ); OUTPUT: RETVAL int _bind(listenSock,portnumber) int listenSock int portnumber CODE: struct sockaddr_in servaddr; struct sctp_initmsg initmsg; bzero( (void *)&servaddr, sizeof(servaddr) ); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl( INADDR_ANY ); servaddr.sin_port = htons(portnumber); bind( listenSock, (struct sockaddr *)&servaddr, sizeof(servaddr) ); /* Specify that a maximum of 5 streams will be available per socket */ memset( &initmsg, 0, sizeof(initmsg) ); initmsg.sinit_num_ostreams = 5; initmsg.sinit_max_instreams = 5; initmsg.sinit_max_attempts = 4; setsockopt( listenSock, IPPROTO_SCTP, SCTP_INITMSG,&initmsg, sizeof(initmsg) ); /* Place the server socket into the listening state */ listen( listenSock, 5 ); RETVAL=listenSock; OUTPUT: RETVAL int _connect(connSock,hostname,portnumber) int connSock char *hostname int portnumber CODE: int in; struct sockaddr_in servaddr; struct sctp_status status; struct sctp_event_subscribe events; struct sctp_initmsg initmsg; /* Specify that a maximum of 5 streams will be available per socket */ memset( &initmsg, 0, sizeof(initmsg) ); initmsg.sinit_num_ostreams = 5; initmsg.sinit_max_instreams = 5; initmsg.sinit_max_attempts = 4; setsockopt( connSock, IPPROTO_SCTP, SCTP_INITMSG, &initmsg, sizeof(initmsg) ); /* Specify the peer endpoint to which we'll connect */ bzero( (void *)&servaddr, sizeof(servaddr) ); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(portnumber); servaddr.sin_addr.s_addr = inet_addr(hostname); /* Connect to the server */ connect( connSock, (struct sockaddr *)&servaddr, sizeof(servaddr) ); /* Enable receipt of SCTP Snd/Rcv Data via sctp_recvmsg */ memset( (void *)&events, 0, sizeof(events) ); events.sctp_data_io_event = 1; setsockopt( connSock, SOL_SCTP, SCTP_EVENTS, (const void *)&events, sizeof(events) ); /* Read and emit the status of the Socket (optional step) */ in = sizeof(status); getsockopt( connSock, SOL_SCTP, SCTP_STATUS, (void *)&status, (socklen_t *)&in ); printf("assoc id = %d\n", status.sstat_assoc_id ); printf("state = %d\n", status.sstat_state ); printf("instrms = %d\n", status.sstat_instrms ); printf("outstrms = %d\n", status.sstat_outstrms ); RETVAL=connSock; OUTPUT: RETVAL int _accept(listenSock) int listenSock CODE: int connSock; int in; struct sctp_status status; //printf("Socket: %d\n",listenSock); connSock = accept( listenSock, (struct sockaddr *)NULL, (int *)NULL ); /* Read and emit the status of the Socket (optional step) */ in = sizeof(status); getsockopt( connSock, SOL_SCTP, SCTP_STATUS, (void *)&status, (socklen_t *)&in ); printf("assoc id = %d\n", status.sstat_assoc_id ); printf("state = %d\n", status.sstat_state ); printf("instrms = %d\n", status.sstat_instrms ); printf("outstrms = %d\n", status.sstat_outstrms ); RETVAL=connSock; OUTPUT: RETVAL int _recieve(connSock,buffer,buffersize) int connSock char *buffer int buffersize CODE: int oi, i,len,flags; char *tempbuffer; struct sctp_sndrcvinfo sndrcvinfo; tempbuffer = (char*) malloc(buffersize+1); len=sctp_recvmsg( connSock, (void *)tempbuffer, buffersize, (struct sockaddr *)NULL, 0, &sndrcvinfo, &flags ); if (len>0) { //printf("buffer leng %d\n",len); buffer = (char*) malloc((len*2)+1); //printf("After malloc\n"); //buffer[0]=0; for (i=0;i