I am trying to pass a TOS option on
SOCK_STREAM socket ,from client to server.
I have used
sendmsg and recvmsg for this purpose , data transmitted O.K., but I failed
when trying to get the TOS option from server side .
Could you please
have a look for the piece of code below, and tell if I am missing
something.
thanks in advance for
cooperation.
The code
:
TCP
Connection has established then:
Client
side (sending data)
struct msghdr msg = {0};
struct cmsghdr *cmsg;
int TOS=66,nwrite;
char buf[CMSG_SPACE(sizeof TOS)];
struct iovec saiov;
char sendbuf[10]="aaaaa";
struct cmsghdr *cmsg;
int TOS=66,nwrite;
char buf[CMSG_SPACE(sizeof TOS)];
struct iovec saiov;
char sendbuf[10]="aaaaa";
saiov.iov_base =
sendbuf;
saiov.iov_len = sizeof(sendbuf);
msg.msg_iov = &saiov;
msg.msg_iovlen=1;
msg.msg_control = buf;
msg.msg_controllen = sizeof buf;
saiov.iov_len = sizeof(sendbuf);
msg.msg_iov = &saiov;
msg.msg_iovlen=1;
msg.msg_control = buf;
msg.msg_controllen = sizeof buf;
cmsg =
CMSG_FIRSTHDR(&msg);
cmsg->cmsg_level = SOL_IP;
cmsg->cmsg_type = IP_TOS;
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
*(int*)CMSG_DATA(cmsg) = TOS;
msg.msg_controllen = cmsg->cmsg_len;
msg.msg_flags =0;
if ((nwrite=sendmsg(sd, &msg, 0)) < 0) {
perror("sendmsg() failed\n");
exit(1);
}
cmsg->cmsg_level = SOL_IP;
cmsg->cmsg_type = IP_TOS;
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
*(int*)CMSG_DATA(cmsg) = TOS;
msg.msg_controllen = cmsg->cmsg_len;
msg.msg_flags =0;
if ((nwrite=sendmsg(sd, &msg, 0)) < 0) {
perror("sendmsg() failed\n");
exit(1);
}
Server
side (receiving data)
int bytes_read;
struct msghdr recv = {0};
struct msghdr recv = {0};
struct cmsghdr *cmsg;
int TOS;
char buf[CMSG_SPACE(sizeof TOS)];
struct iovec saiov;
char recvbuf[10];
int TOS;
char buf[CMSG_SPACE(sizeof TOS)];
struct iovec saiov;
char recvbuf[10];
saiov.iov_base = recvbuf;
saiov.iov_len = sizeof(recvbuf);
recv.msg_iov = &saiov;
recv.msg_iovlen=1;
recv.msg_name = 0;
recv.msg_namelen = 0;
recv.msg_control = buf;
recv.msg_controllen = sizeof buf;
recv.msg_flags=0;
saiov.iov_len = sizeof(recvbuf);
recv.msg_iov = &saiov;
recv.msg_iovlen=1;
recv.msg_name = 0;
recv.msg_namelen = 0;
recv.msg_control = buf;
recv.msg_controllen = sizeof buf;
recv.msg_flags=0;
if((bytes_read=recvmsg(sd, &recv, 0)) < 0 )
{
perror("\nrecvmsg() failed\n");
exit(1);
} else {
cmsg = CMSG_FIRSTHDR(&recv);
cout<<*(int *)CMSG_DATA(cmsg)<<endl;
}
perror("\nrecvmsg() failed\n");
exit(1);
} else {
cmsg = CMSG_FIRSTHDR(&recv);
cout<<*(int *)CMSG_DATA(cmsg)<<endl;
}