[C] 纯文本查看 复制代码 void Server_Thread (void *arg) {
SOCKADDR_IN addr;
IN_ADDR dst_ip;
MSGHDR msg;
IOVEC iov;
union {
CMSGHDR cm;
uint8_t raw[32];
} control_un;
CMSGHDR *cmsg;
int32_t sock, res;
char dbuf[4];
char enable;
while (1) {
sock = socket (AF_INET, SOCK_DGRAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT_NUM);
addr.sin_addr.s_addr = INADDR_ANY;
bind (sock, (SOCKADDR *)&addr, sizeof(addr));
// Enable receiving destination IPv4 address
enable = 1;
setsockopt (sock, IPPROTO_IP, IP_RECVDSTADDR, &enable, sizeof(enable));
// Specify receive IO buffer
iov.iov_base = &dbuf[0];
iov.iov_len = sizeof(dbuf);
// Construct message header
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_name = &addr;
msg.msg_namelen = sizeof(addr);
msg.msg_control = &control_un.cm;
msg.msg_controllen = sizeof(control_un);
while (1) {
res = recvmsg (sock, &msg, 0);
if (res <= 0) {
break;
}
// Process control data
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_RECVDSTADDR) {
IN_ADDR *pia = (IN_ADDR *)CMSG_DATA(cmsg);
dst_ip.sin_addr.s_addr = pia->s_addr;
}
}
// Process normal data
procrec ((uint8_t *)dbuf);
printf ("Remote IP: %s\n", inet_ntoa(addr.sin_addr));
printf ("Remote port: %d\n", ntohs (addr.sin_port));
}
closesocket (sock);
}
}
|