sctpserv02.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include "unp.h"
  2. int
  3. main(int argc, char **argv)
  4. {
  5. int sock_fd,msg_flags;
  6. char readbuf[BUFFSIZE];
  7. struct sockaddr_in servaddr, cliaddr;
  8. struct sctp_sndrcvinfo sri;
  9. struct sctp_event_subscribe evnts;
  10. int stream_increment=1;
  11. socklen_t len;
  12. size_t rd_sz;
  13. struct sctp_initmsg initm;
  14. /* include modified_sctpserv02 */
  15. if (argc == 2)
  16. stream_increment = atoi(argv[1]);
  17. sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
  18. bzero(&initm,sizeof(initm));
  19. initm.sinit_num_ostreams = SERV_MORE_STRMS_SCTP;
  20. Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_INITMSG,
  21. &initm, sizeof(initm));
  22. /* end modified_sctpserv02 */
  23. bzero(&servaddr, sizeof(servaddr));
  24. servaddr.sin_family = AF_INET;
  25. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  26. servaddr.sin_port = htons(SERV_PORT);
  27. Bind(sock_fd, (SA *) &servaddr, sizeof(servaddr));
  28. bzero(&evnts, sizeof(evnts));
  29. evnts.sctp_data_io_event = 1;
  30. Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS,
  31. &evnts, sizeof(evnts));
  32. Listen(sock_fd, LISTENQ);
  33. for ( ; ; ) {
  34. len = sizeof(struct sockaddr_in);
  35. rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),
  36. (SA *)&cliaddr, &len,
  37. &sri,&msg_flags);
  38. if(stream_increment) {
  39. sri.sinfo_stream++;
  40. if(sri.sinfo_stream >= sctp_get_no_strms(sock_fd,(SA *)&cliaddr, len))
  41. sri.sinfo_stream = 0;
  42. }
  43. Sctp_sendmsg(sock_fd, readbuf, rd_sz,
  44. (SA *)&cliaddr, len,
  45. sri.sinfo_ppid,
  46. sri.sinfo_flags,
  47. sri.sinfo_stream,
  48. 0, 0);
  49. }
  50. }