当前位置:  技术问答>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 呢?

|

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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 如何在一个已知的UNIX帐号下破解系统另一个已知帐号的密码??
  • linux下如何编程实现远程开机,已知mac地址
  • 已知一个进程的PID,如何得到其他信息?
  • 请问:如何根据已知数据画直线、矩形等图像,并以图像文件输出!
  • 请问已知进程的PID,通过什么函数可以得到进程的名字?
  • Solaris系统下如何获得进程名(已知进程ID)?
  • 菜菜的问一声,如何找到一个目录,目录名已知
  • 已知硬盘分区表项,如何计算该分区的第一个扇区在那?
  • 请问有没有办法方便提取某个已知进程所占用的socket号?谢谢
  • 已知一段文本,在unix怎样查找包含该文本的文件
  • 已知pid文件,实现杀死该进程的shell脚本怎么写?
  • 已知进程名,检测进程是否在运行并调用
  • 『硬盘』求获得硬盘格式和信息的办法,和已知CHS如何进行寻址,求教!
  • 在C SHELL中,如何判断在某一指定目录下是否有已知文件名存在?
  • 有没有可以从已知图片里过滤出,不规则图片的滤镜??
  • 求jsp向对方已知IP传GET方法及参数,并分析返回字符串的例子?
  • File类的getLastModify()得到的是长型整数,如何才能得到一个已知文件日期?
  • 已知一个进程的PID,但不知道这个进程是否停止,如何能知道系统中是否有相应的进程在运行。
  • 已知a=1,b=2 String string="a+b";如何将string转化为表达式,并计算结果
  • 笨问题----已知今天日期,怎样得到明天日期?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3