Hi,

I'm trying to create a program that will be able to send tcp packets using raw sockets. In order to do so I need to pass values like ip-addresses and port numbers to the send_tcp function, but I do not know how using getopt_long.

Code:
int main(int argc,char **argv)
{
    int c;
    
    /* Are we in root? */    
    if(geteuid() !=0)
        {
            printf("Root access is required to run this program.\n\n");
            exit(0);        
        }    
        
    while (1)
        {
            static struct option long_options[] =
                {
                    /* Options */
                {"send",       no_argument,       0, 's'}, /* args s and r have no function yet */
                {"recieve",    no_argument,       0, 'r'},
                {"file",       required_argument, 0, 'f'}, 
                {"destip",     required_argument, 0, 'i'},
                {"destport",   required_argument, 0, 'p'},
                {"sourceip",   required_argument, 0, 'o'},
                {"sourceport", required_argument, 0, 't'},
                {0, 0, 0, 0}
                };
            
               int option_index = 0;
             
               c = getopt_long (argc, argv, "srf:d:i:p:o:t:",
                            long_options, &option_index);
             
                          /* Detect the end of the options. */
               if (c == -1)
                 break;
             
               switch (c)
                 {
                 case 0:
                   /* If this option set a flag, do nothing else now. */
                   if (long_options[option_index].flag != 0)
                 break;
                   printf ("option %s", long_options[option_index].name);
                   if (optarg)
                 printf (" with arg %s", optarg);
                   printf ("\n");
                   break;
             
                 case 's':
                   puts ("option -s\n");
                   break;
             
                 case 'r':
                   puts ("option -r\n");
                   break;
             
                 case 'f':
                   printf ("option -f with value `%s'\n", optarg);
                   break;
                                
                 case 'i':
                   printf ("option -i with value `%s'\n", optarg);
                   break;
             
                 case 'p':
                   printf ("option -p with value `%s'\n", optarg);
                   break;
                   
                 case 'o': 
                   printf ("option -o with value `%s'\n", optarg);
                   break;
                   
                 case 't': 
                   printf ("option -t with value `%s'\n", optarg);
                   break;
             
                 case '?':
                   /* Error message printed */
                   break;
             
                 default:
                   abort ();
                 }
             }
             
               /* Print any remaining command line arguments (not options). */
            if (optind < argc)
        {
            printf ("non-option ARGV-elements: ");
            while (optind < argc)
            printf ("%s ", argv[optind++]);
            putchar ('\n');
        }

        forgepacket(sourceip, destip, sourceport, destport, file);
         
        getchar ();
        exit (0);
}

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 = inet_addr(???);
                ip->iph_destip = inet_addr(???);
                
                /* TCP attributes */
                tcp->tcph_sourceport = htons(atoi(???));
                tcp->tcph_destport = htons(atoi(???));
                
                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 = htons(atoi(???));
                din.sin_port = htons(atoi(???));
                
                /* Source IP */
                
                sin.sin_addr.s_addr = inet_addr(???);
                din.sin_addr.s_addr = inet_addr(???);
                
            }
I've placed 3 question marks where I believe something needs to be added, but to be honest I haven't got a clue, despite active googling. The printf statements in the various cases obviously needs changing to, but as I've said, I'm stumped.

Any suggestions?