免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: djking1986
打印 上一主题 下一主题

一个socket 两个端口 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-07-21 17:22 |只看该作者
为什么 有这种想法
初衷是什么

论坛徽章:
0
12 [报告]
发表于 2010-07-21 17:48 |只看该作者
随便网上找了找代码,你自己去改一下.

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <linux/if_ether.h>
#include <linux/in.h>
#define BUFFER_MAX 2048

int main(int argc, char *argv[])
{
        
        int sock, n_read, proto;        
        char buffer[BUFFER_MAX];
        char  *ethhead, *iphead, *tcphead,
                         *udphead, *icmphead, *p;
        
if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) < 0)
    {
        fprintf(stdout, "create socket error\n";
        exit(0);
    }
        
while(1)
{
     n_read = recvfrom(sock, buffer, 2048, 0, NULL, NULL);
        /*
        14   6(dest)+6(source)+2(type or length)
        +
        20   ip header
        +
        8   icmp,tcp or udp header
        = 42
        */
if(n_read < 42)
   {
      fprintf(stdout, "Incomplete header, packet corrupt\n";
      continue;
   }
               
        ethhead = buffer;
        p = ethhead;
        int n = 0XFF;
                printf("MAC: %.2X:%02X:%02X:%02X:%02X:%02X==>"
                           "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",
        p[6]&n, p[7]&n, p[8]&n, p[9]&n, p[10]&n, p[11]&n,
        p[0]&n, p[1]&n, p[2]&n,p[3]&n, p[4]&n, p[5]&n);

                   iphead = ethhead + 14;  
                   p = iphead + 12;
        
           printf("IP: %d.%d.%d.%d => %d.%d.%d.%d\n",
           p[0]&0XFF, p[1]&0XFF, p[2]&0XFF, p[3]&0XFF,
           p[4]&0XFF, p[5]&0XFF, p[6]&0XFF, p[7]&0XFF);
            proto = (iphead + 9)[0];
            p = iphead + 20;
             printf("rotocol: ";
            switch(proto)
              {
                case IPPROTO_ICMP: printf("ICMP\n";break;
                case IPPROTO_IGMP: printf("IGMP\n";break;
                case IPPROTO_IPIP: printf("IPIP\n";break;
                case IPPROTO_TCP :
                case IPPROTO_UDP :
    printf("%s,", proto == IPPROTO_TCP ? "TCP": "UDP";
    printf("source port: %u,",(p[0]<<&0XFF00 |  p[1]&0XFF);
    printf("dest port: %u\n", (p[2]<<&0XFF00 | p[3]&0XFF);
         break;
    case IPPROTO_RAW : printf("RAW\n";break;
    default:printf("Unkown, please query in include/linux/in.h\n";
        }
   }
}

论坛徽章:
0
13 [报告]
发表于 2010-07-21 17:56 |只看该作者
soket五元组  一一对应 如何分得了

论坛徽章:
0
14 [报告]
发表于 2010-07-21 18:32 |只看该作者
做一个转发

论坛徽章:
1
申猴
日期:2014-04-18 16:29:14
15 [报告]
发表于 2010-07-21 18:38 |只看该作者
是想像ftp那样吗。
ftp是不是开两socket的?

论坛徽章:
0
16 [报告]
发表于 2010-07-21 23:13 |只看该作者
感谢各位的热心回帖 有人问我想实现什么?其实也就是想给自己的http服务器提供两个不同的访问端口 我自己也查了好久没发现一个socket可以绑定两个端口的 最后还是用了两个socket来实现的。。

论坛徽章:
0
17 [报告]
发表于 2010-07-21 23:32 |只看该作者
前面两个socket监听两端端口 再转发给后面的一个socket{:3_189:}

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
18 [报告]
发表于 2010-07-22 10:06 |只看该作者
我想用一个socket来同时监听两个端口(比如:80和43端口) 不知socket是否支持这样的属性?
希望知情人士告知 ...
djking1986 发表于 2010-07-21 10:55



    还是用两个socket,用select或epoll同时守候两个socket。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP