From: "Nguyễn Phước Thành" <ht22.pt@gmail.com>
To: linux-sctp@vger.kernel.org
Subject: Problem code multi-streaming
Date: Thu, 09 Jun 2011 03:09:33 +0000 [thread overview]
Message-ID: <4DF0396D.50401@gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 613 bytes --]
I have some code demo using multi-streaming, but it is not run right.I
attach my code send file in this mail. I using this code from sctp_test,
but i don't know why it error.
I use sinfo->sinfo_stream = 1; and when send one chunk I change stream :
if(stream==1) stream=2;
if(stream==2) stream=1;
But capture packet with Wireshark I see SID is always 1, I send packet
is order, using multi-homing.
All different functions run ok.I don't know why SID don't change.I read
this darft of socket API SCTP in folder doc of LKSCTP, but I don't
understand why I write code like sctp_test but sctp_test run ok.
[-- Attachment #2: codesend_file.c --]
[-- Type: text/plain, Size: 4307 bytes --]
void send_file(int sk)\r{\r struct msghdr outmsg;\r char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];\r struct cmsghdr *cmsg;\r struct sctp_sndrcvinfo *sinfo;\r struct iovec iov;\r char message[1500];\r struct hostent *hst;\r struct sockaddr *addrs;\r int msglen;\r int error = 0;\r int try_error=0;\r int stream = 1;\r //Kiem lai dia chi dich va gan cac thong tin phu hop\r if (remote_host != NULL) {\r hst = gethostbyname(remote_host);\r if (hst == NULL || hst->h_length < 1) {\r fprintf(stderr, "%s: bad hostname: \n",\r remote_host);\r exit(1);\r }\r ra_family = hst->h_addrtype;\r ra_len = sizeof(remote_addr);\r ra_raw = &remote_addr.sin_addr;\r remote_addr.sin_port = htons(8000);\r remote_addr.sin_family = AF_INET;\r memcpy(ra_raw, hst->h_addr_list[0], hst->h_length);\r }\r else\r {\r //Hostname khong ton tai thoat chuong trinh...\r printf("Not found remote host!!!\n");\r printf("Shutdown program.\n");\r exit(1);\r }\r printf("Host name is %s.\n",remote_host);\r // KIem tra su ton tai cua ket noi toi remote addrs\r if ((SOCK_SEQPACKET == socket_type) && associd &&\r (0 != test_sk_for_assoc(sk, associd))) {\r associd = test_recv_assoc_change(sk);\r printf("Old association gone, Starting a new one!\n");\r new_connection = 1;\r }\r int fd;\r if ( localfile == NULL ) fd = 0;\r fd = open(localfile,O_RDONLY);\r if(fd==-1)\r {\r printf("Read file error.\n");\r exit(1);\r }\r fprintf(stderr," ready to send...\n");\r printf("Ready to send file....\n");\r msglen=read(fd,message,1024);\r do {\r /* Initialize the message struct we use to pass\r * messages to the remote socket.\r */\r try_error++;\r if(try_error==100)\r {\r printf("Can't connect remote address,program shutdown.\n");\r exit(1);\r }\r iov.iov_base = message;\r iov.iov_len = msglen;\r outmsg.msg_iov = &iov;\r outmsg.msg_iovlen = 1;\r outmsg.msg_control = outcmsg;;\r outmsg.msg_controllen = sizeof(outcmsg);\r outmsg.msg_name = &remote_addr;\r outmsg.msg_namelen = ra_len;\r cmsg = CMSG_FIRSTHDR(&outmsg);\r cmsg->cmsg_level = IPPROTO_SCTP;\r cmsg->cmsg_type = SCTP_SNDRCV;\r cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));\r outmsg.msg_controllen = cmsg->cmsg_len;\r sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);\r memset(sinfo, 0, sizeof(struct sctp_sndrcvinfo));\r sinfo->sinfo_flags = 0;\r sinfo->sinfo_stream = 1;\r sinfo->sinfo_ppid=rand();\r error = sendmsg(sk, &outmsg, MSG_WAITALL);\r if (error != msglen) \r printf(stderr, ": error: %s.\n", strerror(errno));\r } while (error != msglen);\r\r /* If this is the first message sent over a UDP-style socket,\r * get the associd from the SCTP_ASSOC_CHANGE notification.\r */\r if ((SOCK_SEQPACKET == socket_type) && (0 == associd))\r associd = test_recv_assoc_change(sk);\r\r /* Verify there is no association. */\r if (0 != test_sk_for_assoc(sk, associd)) {\r printf("No association is present now!!\n");\r new_connection = 1;\r }\r else {\r if (new_connection) {\r int rc = sctp_getpaddrs(sk, associd, &addrs);\r if (0 >= rc) {\r if (rc == 0) {\r fprintf(stderr, "sctp_getpaddrs failed, no peers.\n");\r } else {\r fprintf(stderr, "sctp_getpaddrs failed %s(%d).\n", strerror(errno), errno);\r }\r exit(1);\r }\r printf("New connection, peer addresses\n");\r //print_addr_buf(addrs, rc);\r sctp_freepaddrs(addrs);\r new_connection = 0;\r }\r }\r iov.iov_base = buffer;\r iov.iov_len = 1;\r outmsg.msg_iov = &iov;\r outmsg.msg_iovlen = 1;\r /* open the file */\r \r while ( (msglen = read(fd,buffer,1024)) > 0 ) {\r /* Send to our neighbor. */\r if(stream==1) stream=2;\r if(stream==2) stream=1;\r sinfo->sinfo_stream = stream;\r iov.iov_len = msglen;\r sendmsg(sk, &outmsg, MSG_WAITALL);\r }\r\r close(fd);\r close(sk);\r}
next reply other threads:[~2011-06-09 3:09 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-09 3:09 Nguyễn Phước Thành [this message]
2011-06-09 4:27 ` Problem code multi-streaming Max Matveev
2011-06-09 7:31 ` Wei Yongjun
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4DF0396D.50401@gmail.com \
--to=ht22.pt@gmail.com \
--cc=linux-sctp@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.