Advertisement
Hexkritor

Untitled

Dec 25th, 2016
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.57 KB | None | 0 0
  1. /*
  2. * sctpclnt.c
  3. *
  4. * SCTP multi-stream client.
  5. *
  6. * M. Tim Jones <mtj@mtjones.com>
  7. *
  8. */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <unistd.h>
  14. #include <sys/socket.h>
  15. #include <sys/types.h>
  16. #include <netinet/in.h>
  17. #include <netinet/sctp.h>
  18. #include <arpa/inet.h>
  19. #include "common.h"
  20.  
  21. int main()
  22. {
  23. int connSock, in, i, ret, flags;
  24. struct sockaddr_in servaddr;
  25. struct sctp_status status;
  26. struct sctp_sndrcvinfo sndrcvinfo;
  27. struct sctp_event_subscribe events;
  28. struct sctp_initmsg initmsg;
  29. char buffer[MAX_BUFFER+1];
  30.  
  31. /* Create an SCTP TCP-Style Socket */
  32. connSock = socket( AF_INET, SOCK_STREAM, IPPROTO_SCTP );
  33.  
  34. /* Specify that a maximum of 5 streams will be available per socket */
  35. memset( &initmsg, 0, sizeof(initmsg) );
  36. initmsg.sinit_num_ostreams = 5;
  37. initmsg.sinit_max_instreams = 5;
  38. initmsg.sinit_max_attempts = 4;
  39. ret = setsockopt( connSock, IPPROTO_SCTP, SCTP_INITMSG,
  40. &initmsg, sizeof(initmsg) );
  41.  
  42. /* Specify the peer endpoint to which we'll connect */
  43. bzero( (void *)&servaddr, sizeof(servaddr) );
  44. servaddr.sin_family = AF_INET;
  45. servaddr.sin_port = htons(MY_PORT_NUM);
  46. servaddr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
  47.  
  48. /* Connect to the server */
  49. ret = connect( connSock, (struct sockaddr *)&servaddr, sizeof(servaddr) );
  50.  
  51. /* Enable receipt of SCTP Snd/Rcv Data via sctp_recvmsg */
  52. memset( (void *)&events, 0, sizeof(events) );
  53. events.sctp_data_io_event = 1;
  54. ret = setsockopt( connSock, SOL_SCTP, SCTP_EVENTS,
  55. (const void *)&events, sizeof(events) );
  56.  
  57. /* Read and emit the status of the Socket (optional step) */
  58. in = sizeof(status);
  59. ret = getsockopt( connSock, SOL_SCTP, SCTP_STATUS,
  60. (void *)&status, (socklen_t *)&in );
  61.  
  62. printf("assoc id = %d\n", status.sstat_assoc_id );
  63. printf("state = %d\n", status.sstat_state );
  64. printf("instrms = %d\n", status.sstat_instrms );
  65. printf("outstrms = %d\n", status.sstat_outstrms );
  66.  
  67. /* Expect two messages from the peer */
  68.  
  69. for (i = 0 ; i < 2 ; i++) {
  70.  
  71. in = sctp_recvmsg( connSock, (void *)buffer, sizeof(buffer),
  72. (struct sockaddr *)NULL, 0, &sndrcvinfo, &flags );
  73.  
  74. if (in > 0) {
  75. buffer[in] = 0;
  76. if (sndrcvinfo.sinfo_stream == LOCALTIME_STREAM) {
  77. printf("(Local) %s\n", buffer);
  78. } else if (sndrcvinfo.sinfo_stream == GMT_STREAM) {
  79. printf("(GMT ) %s\n", buffer);
  80. }
  81. }
  82.  
  83. }
  84.  
  85. /* Close our socket and exit */
  86. close(connSock);
  87.  
  88. return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement