enhanced Socket::send where IP_SENDSRCADDR is available
This commit is contained in:
		@ -588,6 +588,7 @@ qse_ssize_t Socket::send (const qse_ioptl_t* iov, int count, const SocketAddress
 | 
				
			|||||||
	#if defined(AF_INET)
 | 
						#if defined(AF_INET)
 | 
				
			||||||
		case AF_INET:
 | 
							case AF_INET:
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
							#if defined(IP_PKTINFO)
 | 
				
			||||||
			qse_uint8_t cmsgbuf[CMSG_SPACE(QSE_SIZEOF(struct in_pktinfo))];
 | 
								qse_uint8_t cmsgbuf[CMSG_SPACE(QSE_SIZEOF(struct in_pktinfo))];
 | 
				
			||||||
			msg.msg_control = cmsgbuf;
 | 
								msg.msg_control = cmsgbuf;
 | 
				
			||||||
			msg.msg_controllen = CMSG_LEN(QSE_SIZEOF(struct in_pktinfo));
 | 
								msg.msg_controllen = CMSG_LEN(QSE_SIZEOF(struct in_pktinfo));
 | 
				
			||||||
@ -603,6 +604,22 @@ qse_ssize_t Socket::send (const qse_ioptl_t* iov, int count, const SocketAddress
 | 
				
			|||||||
			pi->ipi_ifindex = 0; // let the kernel choose it
 | 
								pi->ipi_ifindex = 0; // let the kernel choose it
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
							#elif defined(IP_SENDSRCADDR)
 | 
				
			||||||
 | 
								qse_uint8_t cmsgbuf[CMSG_SPACE(QSE_SIZEOF(struct in_addr))];
 | 
				
			||||||
 | 
								msg.msg_control = cmsgbuf;
 | 
				
			||||||
 | 
								msg.msg_controllen = CMSG_LEN(QSE_SIZEOF(struct in_addr));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
 | 
				
			||||||
 | 
								cmsg->cmsg_level = IPPROTO_IP;
 | 
				
			||||||
 | 
								cmsg->cmsg_type = IP_SENDSRCADDR;
 | 
				
			||||||
 | 
								cmsg->cmsg_len = CMSG_LEN(QSE_SIZEOF(struct in_addr));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								struct in_addr* pi = (struct in_addr*)CMSG_DATA(cmsg);
 | 
				
			||||||
 | 
								*pi = *(struct in_addr*)srcaddr.getIp6addr();
 | 
				
			||||||
 | 
							#else
 | 
				
			||||||
 | 
								this->setErrorCode (E_NOIMPL);
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							#endif
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
	#if defined(AF_INET6)
 | 
						#if defined(AF_INET6)
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user