1

tcpパッケージを作成して送信できるプログラムを作成しようとしていますが、コンパイル時にこれらのエラーが発生し続けます。

error: expected identifier or ‘(’ before ‘,’ token

error: ‘sin’ undeclared (first use in this function)
error: ‘din’ undeclared (first use in this function)

これらは本当に明白な何かの結果であると確信していますが、私はこのコードを盲目的に見つめているので、頭を悩ませることはできません。機能は次のとおりです。

int send_tcp()
        {
            int sock, one = 1;
            char buffer[PCKT_LEN];
            struct sockaddr_in, sin, din;
            const int *val = &one;

            sock = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
            if (sock < 0)
                {
                    printf("\nError: socket()\n\n");
                    exit (-1);
                }
            else
                    printf ("\nsocket() - Using SOCK_RAW and TCP protocol is OK.\n\n");

            /* Size of the headers */           
            struct ipheader *ip = (struct ipheader *) buffer;
            struct tcpheader *tcp = (struct tcpheader *) (buffer + sizeof (struct ipheader));
            memset (buffer, 0, PCKT_LEN);

            /* IP attributes */
            ip->iph_ihl = 5;
            ip->iph_ver = 4;
            ip->iph_tos = 16;
            ip->iph_len = sizeof(struct ipheader) + sizeof(struct tcpheader);
            ip->iph_id = htons(54321);
            ip->iph_offset = 0;
            ip->iph_ttl = 64;
            ip->iph_protocol = 6;
            ip->iph_chksum = 0; 

            ip->iph_sourceip = sip;
            ip->iph_destip = dip;

            /* TCP attributes */
            tcp->tcph_sourceport = sport;
            tcp->tcph_destport = dport;

            tcp->tcph_seqnum = htonl(1);
            tcp->tcph_acknum = 0;
            tcp->tcph_offset = 5;
            tcp->tcph_syn = 1;
            tcp->tcph_ack = 0;
            tcp->tcph_win = htons(32767);
            tcp->tcph_chksum = 0; 
            tcp->tcph_urgptr = 0;

            ip->iph_chksum = checksum ((unsigned short *) buffer, (sizeof (struct ipheader )+ sizeof (struct tcpheader)));

            /* Address family */ 
            sin.sin_family = AF_INET;
            din.sin_family = AF_INET;

            /* Source port */
            sin.sin_port = sport;
            din.sin_port = dport;

            /* Source IP */
            sin.sin_addr.s_addr = sip;
            din.sin_addr.s_addr = dip;      

            /* Tell the Kernel we're building our own packet */
            if ((setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&one, sizeof (one))) < 0)
                {
                    printf("\nError: Can't set socketoptions\n\n");
                    return (-1);
                }

            /* Send */
            if (sendto(sock, buffer, ip->iph_len, 0, (struct sockaddr *)&sin, sizeof(sin)) < 0)
                {
                    printf("\nError: Can't send packet\n\n");
                    return (-1);
                }

            else
                    printf("Packet sent to %s", dip); 

            close(sock);
        }           

私は次のような印象を受けました:

struct sockaddr_in, sin, din;

十分ですが、それは明らかにそうではありません。これは、予想される識別子のエラーメッセージが指す行でもあります。私は何が欠けていますか?

4

1 に答える 1

4

最初のコンマを削除

 struct sockaddr_in, sin, din;
                   ^
                   ^

sockaddr_inは構造体の名前であるため、上記の行でandsockadddr_inという型の 2 つの変数を宣言しようとしていると想定しています。その場合、変数名が の後に予想されるため、そのコンマを削除する必要があります。あなたがしたことは、次のことを試みることと同じです:sindinstruct sockaddr_in

 int, a,b;

これは、型名の直後にintコンパイラが変数名を期待するため、コンパイルされません。

そのコンマを削除すると、コンパイル エラーが発生しなくなります。

于 2012-07-19T19:04:22.347 に答える