ly602549803 发表于 2013-04-23 20:20

原始套接字做私有协议,求解问题

服务器端#include<stdio.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include "tcpnc.h"
#define SERVER_PORT 8888
#define BUFF_LEN 256
int main(int argc,char *argv[])
{
        int sockfd;
        struct sockaddr_in serv_addr,cli_addr;
        if((sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCPNC))<0)
        {
                perror("socket ");
                exit(1);
        }
        memset(&serv_addr,0,sizeof(serv_addr));
        serv_addr.sin_family=AF_INET;
        serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
        //serv_addr.sin_port=htons(SERVER_PORT);
        memset(&cli_addr,0,sizeof(cli_addr));
        cli_addr.sin_family=AF_INET;
        cli_addr.sin_addr.s_addr=inet_addr("127.0.0.2");
        if(bind(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
        {
                perror("bind ");
                exit(1);
        }
        char buff;
        int len;
        while(1)
        {
                len=sizeof(cli_addr);
                int n=1;
                n=recvfrom(sockfd,buff,BUFF_LEN,0,(struct sockaddr*)&cli_addr,&len);
                if(n==0)
                {
                        printf("recvfrom error!");
                       
                }
                buff='\0';
                printf("message:%s\n",buff+40);
                printf("bytes:%d\n",n);
        }
        close(sockfd);
        return 0;
}客户端#include<stdio.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include "tcpnc.h"
#define SERVER_PORT 8888
#define BUFF_LEN 256
int main(int argc,char *argv[])
{
        int sockfd;
        struct sockaddr_in serv_addr,cli_addr;
        if((sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCPNC))<0)
        {
                perror("socket ");
                exit(1);
        }
        memset(&serv_addr,0,sizeof(serv_addr));
        serv_addr.sin_family=AF_INET;
        serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
        //serv_addr.sin_port=htons(SERVER_PORT);
        memset(&cli_addr,0,sizeof(cli_addr));
        cli_addr.sin_family=AF_INET;
        cli_addr.sin_addr.s_addr=inet_addr("127.0.0.2");
        if(bind(sockfd,(struct sockaddr *)&cli_addr,sizeof(struct sockaddr))==-1)
        {
                perror("bind ");
                exit(1);
        }
        const int on=1;
        if(setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on))==-1)
        {
                perror("setsockopt ");
                exit(0);
        }
        char buf;
        char send_str;
        char *str;
        str=(char *)(buf+20);
        str=send_str;
        printf("please input your message:");
        scanf("%s",send_str);
        send_str='\0';
        ip_hdr *iphdr;
      iphdr = (ip_hdr*)buf;
      //udp_hdr *udphdr;
      //udphdr = (udp_hdr*)(buf+20);
      iphdr->ip_length = 5;
      iphdr->ip_version= 4;
      iphdr->ip_tos = 0;
      iphdr->ip_total_length = htons(sizeof(buf));
      iphdr->ip_id = 0;
      iphdr->ip_flags = 0x40;
      iphdr->ip_ttl = 0x40;
      iphdr->ip_protocol = 0x9c;
      iphdr->ip_cksum = 0;
      iphdr->ip_source = inet_addr("127.0.0.2");//源地址

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

完美主义1 发表于 2013-04-23 20:48

看看                                                                                       
页: [1]
查看完整版本: 原始套接字做私有协议,求解问题