sctpserv_fork.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "unp.h"
  2. int
  3. main(int argc, char **argv)
  4. {
  5. int sock_fd,msg_flags,connfd,childpid;
  6. sctp_assoc_t assoc;
  7. char readbuf[BUFFSIZE];
  8. struct sockaddr_in servaddr, cliaddr;
  9. struct sctp_sndrcvinfo sri;
  10. struct sctp_event_subscribe evnts;
  11. socklen_t len;
  12. size_t rd_sz;
  13. sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
  14. bzero(&servaddr, sizeof(servaddr));
  15. servaddr.sin_family = AF_INET;
  16. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  17. servaddr.sin_port = htons(SERV_PORT);
  18. Bind(sock_fd, (SA *) &servaddr, sizeof(servaddr));
  19. bzero(&evnts, sizeof(evnts));
  20. evnts.sctp_data_io_event = 1;
  21. Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS,
  22. &evnts, sizeof(evnts));
  23. Listen(sock_fd, LISTENQ);
  24. /* include mod_servfork */
  25. for ( ; ; ) {
  26. len = sizeof(struct sockaddr_in);
  27. rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),
  28. (SA *)&cliaddr, &len,
  29. &sri,&msg_flags);
  30. Sctp_sendmsg(sock_fd, readbuf, rd_sz,
  31. (SA *)&cliaddr, len,
  32. sri.sinfo_ppid,
  33. sri.sinfo_flags,
  34. sri.sinfo_stream,
  35. 0, 0);
  36. assoc = sctp_address_to_associd(sock_fd,(SA *)&cliaddr,len);
  37. if((int)assoc == 0){
  38. err_ret("Can't get association id");
  39. continue;
  40. }
  41. connfd = sctp_peeloff(sock_fd,assoc);
  42. if(connfd == -1){
  43. err_ret("sctp_peeloff fails");
  44. continue;
  45. }
  46. if((childpid = fork()) == 0) {
  47. Close(sock_fd);
  48. str_echo(connfd);
  49. exit(0);
  50. } else {
  51. Close(connfd);
  52. }
  53. }
  54. /* end mod_servfork */
  55. }