編集: 解決策はおそらくページの下部にあります。私は解決策で私の質問に答えました。これが他の人に役立つことを願っています。
ここLinuxで少し問題があります。単純なポート スキャンをプログラミングしていますが、引数を取る関数に問題があります。
コードで説明します:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
//this function handle the arguments.
char* ret[2]= {"NULL","NULL"}; //declaring this in global because of segmention fault?
char** arguments_handle(int argc,char **arg)
{
if(argc!=5)
{
printf("Usage:./file -p PORT-RAGE -h HOST.IP\n");
exit(1);
}
//make sure the user type the correct arguments. in this case just -h and -p
if(strcmp(arg[1],"-p")==0 || strcmp(arg[1],"-h")==0 && strcmp(arg[3],"-p")==0 || strcmp(arg[3],"-h")==0)
{
//if in the arguments we got -h or -p run this
//if is -p
if(strcmp(arg[1],"-p")==0)
{
//take the next argument in this case is the port range and put in our array
strcpy(ret[0],arg[2]);
}
else
{
strcpy(ret[1],arg[2]);
}
if(strcmp(arg[3],"-h")==0)
{
//now for the -h
strcpy(ret[1],arg[4]);
}
else
{
strcpy(ret[0],arg[4]);
}
}
return ret;
}
int main(int argc, char **argv)
{
char** ipnport;
ipnport = arguments_handle(argc,argv);
printf("IP is :%s port range is %s\n",ipnport[0],ipnport[1]);
//the rest of the code about port scan goes here. I'm just cutting
return 0x0;
}
ここでの問題は、正しくコンパイルできますが、セグメンテーション違反が発生することです。どこが間違っているのかわかりません。バッファやスタックのオーバーフローに対処するためのものだと思います。
したがって、この関数でここで行っていることは、argv を取得して、arguments_handle 関数に送信することです。それが行うことは、引数 "-p" と "-h" と "store" が char の配列の正しい順序でどこにあるかを確認することです。この char のように: 「char の配列を含むこの配列への char ポインター」
pointer pointer pointer
pointer to this-> ["firstarg","secondarg","etc"]
その場合、「ポインター ポインター ポインター」は文字列の最初の文字になります。
要約: 文字列配列を作成し、arguments_handle から main の関数に返したいと考えています。
何か案は?:)
心から、
int3