原始套接字选择事件未发生

时间:2015-04-08 18:53:36

标签: c sockets network-programming

我已从客户端发送消息,并使用sendto成功发送。但是在服务器端我创建了多个原始套接字,监视它们上的事件,使用select。但是rfds上的事件没有被select选中。为什么这样?它在选择系统调用时仍然被阻止。

   void main()
    {
        int readSet[2],i;
        struct sockaddr_in source;
        socklen_t client_addr_size;

        //Creating Socket
        readSet[0]=socket(AF_INET,SOCK_RAW,221);
        readSet[1]=socket(AF_INET,SOCK_RAW,222);


        fd_set rfds;
        struct timeval tv;


        if(readSet[0]==-1 || readSet[1]==-1)
        {
            perror("\nSocket:");
            exit(0);
        }

        printf("\nSocket Created\n");

        memset(&source, 0, sizeof(struct sockaddr_in));
        source.sin_family=AF_INET;
        source.sin_addr.s_addr=inet_addr("127.0.0.1");

         FD_ZERO(&rfds);
        while(1)
        {

            for(i=0; i<2; i++)
                FD_SET(readSet[i],&rfds);

            printf("\nBefore select\n");
            int ret = select(readSet[1]+1, &rfds, NULL, NULL, NULL);

            printf("\nRetval:%d\n",ret);
            if(ret>0)
            {
                for(i=0; i<2; i++)
                {
                    if(FD_ISSET(readSet[i],&rfds))
                    {
                        char buff[4096];
                        int ds=0;
                        if( (ds=recvfrom(readSet[i], buff, 4096, 0, (struct sockaddr *)&source, &client_addr_size)) <0 )
                            perror("Error in recv: \n");

                        printf("\nData Receved successfully...%d\n",ds);

                        printIPHeader((unsigned char *)buff);
                        break;
                    }

                }//For loop
            }
        }

        sleep(1);
    }


 //Client siode code
void main()
{
    int rsfd1=0,rsfd2;

    struct sockaddr_in dest_addr;
    socklen_t client_addr_size;

    //Creating Socket 
    rsfd1=socket(AF_INET,SOCK_RAW,221);
    rsfd2=socket(AF_INET,SOCK_RAW,221);

    if(rsfd1==-1 || rsfd2==-1)
    {
        perror("\nSocket:");
        exit(0);
    }

    printf("\nSocket Created: \n"); 

    const int val = 1;
    if(setsockopt(rsfd1, IPPROTO_IP, IP_HDRINCL, &val, sizeof(val)) < 0)
    {
        perror("\nsetsockopt() error:");
        exit(-1);
    }

    if(setsockopt(rsfd2, IPPROTO_IP, IP_HDRINCL, &val, sizeof(val)) < 0)
    {
        perror("\nsetsockopt() error:");
        exit(-1);
    }

   //Constructing IP Header
    char buffer[4096];
    memset(&buffer,0,sizeof(buffer));
    char *msg="Hey there, how are you";
    // Our own headers' structures
    struct iphdr *iph= (struct iphdr *) buffer;

    iph->version=4;
    iph->ihl=5;
    iph->tos=16;
    iph->tot_len=htons(sizeof(iph)+sizeof(msg));
    iph->id=0;
    iph->ttl=255;    //Number of hops
    iph->protocol=253;
    iph->saddr=inet_addr("127.0.0.1");
    iph->daddr=inet_addr("127.0.0.1");

    int iphdrlen =iph->ihl*4;
    strcat(buffer+iphdrlen,msg);
    //End

    memset(&dest_addr, 0, sizeof(struct sockaddr_in));
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_addr.s_addr=inet_addr("127.0.0.1");


    printf("\nCustom IP Header to sent...\n");
    printIPHeader((unsigned char *)buffer);
    int n=0;

    if( (n=sendto(rsfd1,buffer,23,0,(struct sockaddr *)&dest_addr,sizeof(dest_addr))) <0 )
        perror("Sendto error: ");


    char * msg1="I am fine\0";

    strcat(buffer+iphdrlen,msg1);

    //if( (n=sendto(rsfd2,buffer,23,0,(struct sockaddr *)&dest_addr,sizeof(dest_addr))) <0 )
        //perror("Sendto error: ");


    printf("\nData Sent Succefully:%d\n",n);

}

0 个答案:

没有答案