#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <netinet/in.h>
#include <sys/param.h> /* ALIGN macro for CMSG_NXTHDR() macro */
#define UDP_RCV_PORT 20001
#define MAXLINE 1500
int main(int argc, char **argv)
{
int sockfd;
ssize_t n;
int yes=1;
int ttl = -1;
socklen_t msg_namelen;
char mesg[MAXLINE];
struct iovec iov[1];
char control[CMSG_SPACE(sizeof(char))];
struct msghdr msg;
struct sockaddr_in cliaddr, servaddr;
struct cmsghdr * cmsg;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(sockfd, IPPROTO_IP, IP_RECVTTL, &yes, sizeof(yes));
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(UDP_RCV_PORT);
if (bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) {
printf("bind socket error!");
return -1;
}
msg.msg_name = (struct sockaddr *) &cliaddr;
msg.msg_namelen = msg_namelen;
iov[0].iov_base = mesg;
iov[0].iov_len = sizeof(mesg);
msg.msg_iov = iov;
msg.msg_iovlen = 1;
msg.msg_control = control;
msg.msg_controllen = sizeof(control);
msg.msg_flags = 0;
printf("start recv mesg\n");
n = recvmsg(sockfd, &msg, 0);
printf("n = %lu\n", n);
cmsg = CMSG_FIRSTHDR(&msg);
for (; cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_RECVTTL) {
char *ttlPtr = CMSG_DATA(cmsg);
ttl = *ttlPtr;
break;
}
}
printf("rcv ttl = %d\n", ttl);
}