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";
   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;
    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);
 }
 
Server side (receiving data)
 
int bytes_read;
struct msghdr recv = {0};
struct cmsghdr *cmsg;
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;
 
    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;
   }

 

Reply via email to