Client.c
#include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <netinet/sctp.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #define RECVBUFSIZE 4096 #define PPID 1234 int main() { int SctpScocket, in, flags; socklen_t opt_len; char * szAddress; int iPort; char * szMsg; int iMsgSize; char a[1024]; struct sockaddr_in servaddr = {0}; struct sctp_status status = {0}; struct sctp_sndrcvinfo sndrcvinfo = {0}; struct sctp_event_subscribe events = {0}; struct sctp_initmsg initmsg = {0}; char * szRecvBuffer[RECVBUFSIZE + 1] = {0}; socklen_t from_len = (socklen_t) sizeof(struct sockaddr_in); //get the arguments szAddress = "127.0.0.1"; iPort = 5001; printf("Starting SCTP client connection to %s:%u\n", szAddress, iPort); SctpScocket = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); printf("socket created...\n"); //set the association options initmsg.sinit_num_ostreams = 1; setsockopt( SctpScocket, IPPROTO_SCTP, SCTP_INITMSG, &initmsg,sizeof(initmsg)); printf("setsockopt succeeded...\n"); bzero( (void *)&servaddr, sizeof(servaddr) ); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(iPort); servaddr.sin_addr.s_addr = inet_addr( szAddress ); connect( SctpScocket, (struct sockaddr *)&servaddr, sizeof(servaddr)); printf("connect succeeded...\n"); //check status opt_len = (socklen_t) sizeof(struct sctp_status); getsockopt(SctpScocket, IPPROTO_SCTP, SCTP_STATUS, &status, &opt_len); while(1) { printf("Sending Role to server: "); gets(a); sctp_sendmsg(SctpScocket, (const void *)a, iMsgSize, NULL, 0,htonl(PPID), 0, 0 , 0, 0); //read response from test server in = sctp_recvmsg(SctpScocket, (void*)szRecvBuffer, RECVBUFSIZE,(struct sockaddr *)&servaddr, &from_len, &sndrcvinfo, &flags); if (in > 0 && in < RECVBUFSIZE - 1) { szRecvBuffer[in] = 0; printf("Received from server: %s\n",szRecvBuffer); } } printf("exiting...\n"); close(SctpScocket); return 0; }
Server.c
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/sctp.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #define RECVBUFSIZE 4096 #define PPID 1234 int main() { int SctpScocket, n, flags; socklen_t from_len; struct sockaddr_in addr = {0}; struct sctp_sndrcvinfo sinfo = {0}; struct sctp_event_subscribe event = {0}; char pRecvBuffer[RECVBUFSIZE + 1] = {0}; char * szAddress; int iPort; char * szMsg; int iMsgSize; //get the arguments szAddress = "127.0.0.1"; iPort = 5001; szMsg = "Hello Client"; iMsgSize = strlen(szMsg); if (iMsgSize > 1024) { printf("Message is too big for this test\n"); return 0; } //here we may fail if sctp is not supported SctpScocket = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP); printf("socket created...\n"); //make sure we receive MSG_NOTIFICATION setsockopt(SctpScocket, IPPROTO_SCTP, SCTP_EVENTS, &event,sizeof(struct sctp_event_subscribe)); printf("setsockopt succeeded...\n"); addr.sin_family = AF_INET; addr.sin_port = htons(iPort); addr.sin_addr.s_addr = inet_addr(szAddress); //bind to specific server address and port bind(SctpScocket, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); printf("bind succeeded...\n"); //wait for connections listen(SctpScocket, 1); printf("listen succeeded...\n"); int count = 0,i; char a[20][10],d[20][10]; char send_data[1024]; strcpy(a[0],"Abraham"); strcpy(a[1],"Buck"); strcpy(a[2],"Casper"); strcpy(a[3],"Dammy"); strcpy(d[0],"1"); strcpy(d[1],"2"); strcpy(d[2],"3"); strcpy(d[3],"4"); while(1) { //each time erase the stuff flags = 0; memset((void *)&addr, 0, sizeof(struct sockaddr_in)); from_len = (socklen_t)sizeof(struct sockaddr_in); memset((void *)&sinfo, 0, sizeof(struct sctp_sndrcvinfo)); n = sctp_recvmsg(SctpScocket, (void*)pRecvBuffer, RECVBUFSIZE,(struct sockaddr *)&addr, &from_len, &sinfo, &flags); if (-1 == n) { printf("Error with sctp_recvmsg: -1... waiting\n"); printf("errno: %d\n", errno); perror("Description: "); sleep(1); continue; } if (flags & MSG_NOTIFICATION) { printf("Notification received!\n"); printf("From %s:%u\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); } else { printf("Received from %s:%u on stream %d, PPID %d.: %s\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port), sinfo.sinfo_stream, ntohl(sinfo.sinfo_ppid), pRecvBuffer ); int p = 0; for(i=0;i<4;i++) { if(strcmp(pRecvBuffer,d[i]) == 0) { strcpy(send_data,a[i]);p=1; } } if(p == 0) strcpy(send_data,"No one on that role."); } //send message to client printf("Sending to client: %s\n", send_data); sctp_sendmsg(SctpScocket, (const void *)send_data, strlen(send_data), (struct sockaddr *)&addr, from_len, htonl(PPID), 0, 0 /*stream 0*/, 0, 0); //close server when exit is received if (0 == strcmp(pRecvBuffer, "exit")) { break; } }//while printf("exiting...\n"); close(SctpScocket); return (0); }To run this you have to have sctp library installed. then comand like >>$ gcc -g -lsctp filename
robel, please contact me at dave@copycall.com
ReplyDeletecan you please explain the output of the above code..
Delete