当前位置: 技术问答>linux和unix
已知某个连接的 socket_fd , 求是从哪个网口接入的
来源: 互联网 发布时间:2016-03-11
本文导语: 如题! ioctl 中是有这么个命令的SIOCGIFNAME, 但需要提供ifr_ifindex, 但怎么求得这个ifindex 呢? | struct ifreq { char ifr_name[IFNAMSIZ]; /* interface name, e.g., "le0 ...
如题!
ioctl 中是有这么个命令的SIOCGIFNAME, 但需要提供ifr_ifindex, 但怎么求得这个ifindex 呢?
ioctl 中是有这么个命令的SIOCGIFNAME, 但需要提供ifr_ifindex, 但怎么求得这个ifindex 呢?
|
struct ifreq {
char ifr_name[IFNAMSIZ]; /* interface name, e.g., "le0 " */
union {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
short ifru_flags;
int ifru_metric;
caddr_t ifru_data;
} ifr_ifru;
};
int get_host_ip(int tcp_socket)
{
char ip_addr[16];
char net_mask[16];
char gate_way[16];
enum {MAXINTERFACES = 16};
struct ifreq ifreqs[MAXINTERFACES];
struct ifconf ifconf;
int interfaces,i;
memset(ifreqs, 0, sizeof(ifreqs));
ifconf.ifc_len = sizeof(ifreqs);
ifconf.ifc_req = ifreqs;
if(ioctl(tcp_socket, SIOCGIFCONF, (char *)&ifconf) == -1) {
perror("ioctl");
return -1;
}
interfaces = ifconf.ifc_len / sizeof(struct ifreq);
// printf("interfaces %dn",interfaces);
if(interfaces = 2)
--interfaces;
for(i=1;isin_addr), 15);
if(ioctl(tcp_socket, SIOCGIFNETMASK, (char *)&ifreqs[interfaces]) == -1) {
perror("ioctl SIOCGIFNETMASK");
return -1;
}
strncpy(net_mask,
inet_ntoa(((struct sockaddr_in *)&ifreqs[interfaces].ifr_netmask)->sin_addr), 15);
if(ioctl(tcp_socket, SIOCGIFBRDADDR, (char *)&ifreqs[interfaces]) == -1) {
perror("ioctl SIOCGIFBRDADDR");
return -1;
}
strncpy(gate_way,
inet_ntoa(((struct sockaddr_in *)&ifreqs[interfaces].ifr_broadaddr)->sin_addr), 15);
if(ioctl(tcp_socket,SIOCGIFNAME,(char *)&ifreqs[interfaces])==-1)
{
perror("ioctl SIOCGIFNAME");
return -1;
}
strncpy(name,ifreqs[interfaces].ifr_name,IFNAMSIZ);
printf("%sn%sn%snn", ip_addr,net_mask,gate_way);//
}
return 0;
} /* get_ip */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT 2234
#define BACKLOG 10
int main( int argc , char argv[])
{
printf("hello linuxn");
int sockfd,client_fd;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
printf("socket ready creating!n");
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("creat socket error!n");
exit(1);}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = htons(INADDR_ANY);
printf("socket creat ok!!!n");
memset(&(my_addr.sin_zero),0,8);
int BIND=bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr));
if(BIND==-1)
{
printf("bind error!!!n");
exit(1);
}
printf("bind ok!!!n");
if(listen(sockfd,BACKLOG)==-1)
{
printf("listen error!!!n");
exit(1);
}
printf("listen ok!!!!n");
get_host_ip(sockfd);
while(1) {
socklen_t sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *) &remote_addr, &sin_size)) == -1) {
perror( "accept error");
continue;
}
printf( "received a connection from %sn", inet_ntoa(remote_addr.sin_addr));
if (!fork()) {
if (send(client_fd, "Hello, you are connected!n", 26, 0) == -1)
perror( "sende rror!");
close(client_fd);
exit(0);
}
close(client_fd);
}
}
|
这么多三角?
我只能坐沙发帮你顶
我只能坐沙发帮你顶
|
虽然有点看不懂,但是顶一下。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。