0

私のプロジェクトは次のとおりです。クライアントはイーサネットから生のパケットを受信し、それを「sniff_data.bin」というファイルに保存してサーバーに送信します。サーバーはコンテンツを受信して​​パケットを処理し (tcp、icmp、udp などを区別)、「info_agent_ report.」というテキスト ファイルに保存します。txt」ファイル。私のコードに間違いがあると思います。誰でも私を案内してくれませんか、助けてください。

int main()
{
int sockfd, new_sockfd,log,n,x1,x2;
int server_len, client_len,len;
int cont,fh,cont2,x;
int result1;
struct sockaddr_in serveraddress;
struct sockaddr_in address;
struct sockaddr_in client_address;

FILE *ia_address;
char *fname = "/home/shishira/Desktop/packet_capture/info_agent_report.txt";
int buffsize=1024;
char buffer1[1024];
char buffer[1024];
char clntName[INET_ADDRSTRLEN];

if((sockfd = socket(AF_INET,SOCK_STREAM,0))>0)
printf("\n ---------------------------Task Agent---------------------------\n");
printf("\n Socket was created\n");

/*  Name the socket.  */

address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons(9734);
server_len = sizeof(address);
bind(sockfd, (struct sockaddr *)&address, server_len);

/*  Create a connection queue and wait INFO_AGENT_REPORTS  */

listen(sockfd, 5);
while(1)
  {

         char ch;

         printf("\n\n Task agent waiting...\n");

/*  Accept a connection to collect report from INFO_AGENT  */

   client_len = sizeof(client_address);
new_sockfd = accept(sockfd,(struct sockaddr *)&client_address, &client_len);
if (new_sockfd==-1) { perror("Connection Not Accepted!!"); return(1);}
else
 {
 //  x=fork();
 //  if (x==0) // child process starts
  //  {
      printf("\n Information agent is connected\n");

  //for displaying the client address    
 if(inet_ntop(AF_INET,&client_address.sin_addr.s_addr,clntName,sizeof(clntName))!=NULL)
        {
          ia_address = fopen("info_agent_report.txt","a+");  
          fprintf(ia_address,"\nFrom InformationAgent:%s\n",clntName);  
          fclose(ia_address);
        } 
 printf("\n Task agent processed the contents and saved it in 'info_agent_report'  
file\n\n");
      log=open("info_agent_report.txt",O_CREAT|O_RDWR|O_APPEND,0777);
      if(log==-1)
               {
                   perror("cannot open info_agent_report file\n");
                   return(1);
               }

      do
         { 
            x1=read(new_sockfd, buffer1, 1024); 
            x2=write(log,buffer1,x1);
         }
     while (x1>0);
   data_process();//for processing the packet
     close(log);
 // }    child process ends
     close(new_sockfd); 

   }

 }

クライアントのアドレスを表示するコードを info_agent_report.txt に書きました。しかし、表示されていません:(

4

1 に答える 1

0

クライアント名を表示するには: (これを accept の後に置きます)

char clntName[INET_ADDRSTRLEN]; // String to contain client address

if (inet_ntop(AF_INET, &clntAddr.sin_addr.s_addr, clntName,sizeof(clntName)) != NULL){
  printf("Handling client %s/%d\n", clntName, ntohs(clntAddr.sin_port));
}

またはこれ:

char clntName[INET6_ADDRSTRLEN];
char portName[6]; 

if(getnameinfo(&client_address,sizeof client_address,clntName,sizeof(clntName),NULL,0,NI_NUMERICHOST|NI_NUMERICSERV|NI_NUMERICSCOPE)==0){
   printf("Client = %s/%s\n",clntName,portName);
} else {
   printf("Unable to get address\n");
}
于 2013-11-09T10:47:53.643 に答える