免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1653 | 回复: 1
打印 上一主题 下一主题

[学习] 原始套接字做私有协议,求解问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-23 20:20 |只看该作者 |倒序浏览
服务器端
  1. #include<stdio.h>
  2. #include<errno.h>
  3. #include<sys/types.h>
  4. #include<sys/socket.h>
  5. #include<netinet/in.h>
  6. #include<string.h>
  7. #include "tcpnc.h"
  8. #define SERVER_PORT 8888
  9. #define BUFF_LEN 256
  10. int main(int argc,char *argv[])
  11. {
  12.         int sockfd;
  13.         struct sockaddr_in serv_addr,cli_addr;
  14.         if((sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCPNC))<0)
  15.         {
  16.                 perror("socket ");
  17.                 exit(1);
  18.         }
  19.         memset(&serv_addr,0,sizeof(serv_addr));
  20.         serv_addr.sin_family=AF_INET;
  21.         serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
  22.         //serv_addr.sin_port=htons(SERVER_PORT);
  23.         memset(&cli_addr,0,sizeof(cli_addr));
  24.         cli_addr.sin_family=AF_INET;
  25.         cli_addr.sin_addr.s_addr=inet_addr("127.0.0.2");
  26.         if(bind(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
  27.         {
  28.                 perror("bind ");
  29.                 exit(1);
  30.         }
  31.         char buff[BUFF_LEN];
  32.         int len;
  33.         while(1)
  34.         {
  35.                 len=sizeof(cli_addr);
  36.                 int n=1;
  37.                 n=recvfrom(sockfd,buff,BUFF_LEN,0,(struct sockaddr*)&cli_addr,&len);
  38.                 if(n==0)
  39.                 {
  40.                         printf("recvfrom error!");
  41.                        
  42.                 }
  43.                 buff[n]='\0';
  44.                 printf("message:%s\n",buff+40);
  45.                 printf("bytes:%d\n",n);
  46.         }
  47.         close(sockfd);
  48.         return 0;
  49. }
复制代码
客户端
  1. #include<stdio.h>
  2. #include<errno.h>
  3. #include<sys/types.h>
  4. #include<sys/socket.h>
  5. #include<netinet/in.h>
  6. #include<string.h>
  7. #include "tcpnc.h"
  8. #define SERVER_PORT 8888
  9. #define BUFF_LEN 256
  10. int main(int argc,char *argv[])
  11. {
  12.         int sockfd;
  13.         struct sockaddr_in serv_addr,cli_addr;
  14.         if((sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCPNC))<0)
  15.         {
  16.                 perror("socket ");
  17.                 exit(1);
  18.         }
  19.         memset(&serv_addr,0,sizeof(serv_addr));
  20.         serv_addr.sin_family=AF_INET;
  21.         serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
  22.         //serv_addr.sin_port=htons(SERVER_PORT);
  23.         memset(&cli_addr,0,sizeof(cli_addr));
  24.         cli_addr.sin_family=AF_INET;
  25.         cli_addr.sin_addr.s_addr=inet_addr("127.0.0.2");
  26.         if(bind(sockfd,(struct sockaddr *)&cli_addr,sizeof(struct sockaddr))==-1)
  27.         {
  28.                 perror("bind ");
  29.                 exit(1);
  30.         }
  31.         const int on=1;
  32.         if(setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on))==-1)
  33.         {
  34.                 perror("setsockopt ");
  35.                 exit(0);
  36.         }
  37.         char buf[256];
  38.         char send_str[236];
  39.         char *str;
  40.         str=(char *)(buf+20);
  41.         str=send_str;
  42.         printf("please input your message:");
  43.         scanf("%s",send_str);
  44.         send_str[strlen(send_str)-1]='\0';
  45.         ip_hdr *iphdr;
  46.         iphdr = (ip_hdr*)buf;
  47.         //udp_hdr *udphdr;
  48.         //udphdr = (udp_hdr*)(buf+20);
  49.         iphdr->ip_length = 5;
  50.         iphdr->ip_version= 4;
  51.         iphdr->ip_tos = 0;
  52.         iphdr->ip_total_length = htons(sizeof(buf));
  53.         iphdr->ip_id = 0;
  54.         iphdr->ip_flags = 0x40;
  55.         iphdr->ip_ttl = 0x40;
  56.         iphdr->ip_protocol = 0x9c;
  57.         iphdr->ip_cksum = 0;
  58.         iphdr->ip_source = inet_addr("127.0.0.2");//源地址

  59.         iphdr->ip_dest = inet_addr("127.0.0.1");//目的地址
  60.         iphdr->ip_cksum = checksum((unsigned short*)buf, 20);
  61.         int res =sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
  62.         return 0;
  63. }
复制代码
为什么运行出来以后,显示
message:

论坛徽章:
0
2 [报告]
发表于 2013-04-23 20:48 |只看该作者
看看                                                                                       
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP