2017-04-06 61 views
-1

我有一個C腳本,它使用套接字連接到遠程服務器並寫入命令。當我切換源IP地址時,C socket bind會變慢

我必須儘快做到這一點,我需要從源IP地址切換。問題是,當我從IP地址切換時,綁定速度減慢了幾秒鐘。

我找不到解決方案。

代碼:

#include <sys/socket.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <arpa/inet.h> 

int main() 
{ 

    struct sockaddr_in source, destination = {}; //two sockets declared as previously 
    int sock = 0; 
    int n = 0; 
    int datalen = 0; 
    int pkt = 0; 


    char* ips[3] = {"10.0.0.1", "10.0.0.2", "10.0.0.3"}; 

    uint8_t *send_buffer; 
    char recv_buffer[11]; 

    struct sockaddr_storage fromAddr; // same as the previous entity struct sockaddr_storage serverStorage; 
    unsigned int addrlen; //in the previous example socklen_t addr_size; 
    struct timeval tv; 
    tv.tv_sec = 3; /* 3 Seconds Time-out */ 
    tv.tv_usec = 0; 

    /*Inititalize source to zero*/ 
    memset(&source, 0, sizeof(source));  //source is an instance of sockaddr_in. Initialization to zero 
    /*Inititalize destinaton to zero*/ 
    memset(&destination, 0, sizeof(destination)); 


     /* setting the destination, i.e our OWN IP ADDRESS AND PORT */ 
     destination.sin_family = AF_INET;     
     // destination.sin_addr.s_addr = inet_addr("123.456.789.123"); 
     destination.sin_port = htons(43); 


      /*---- Configure settings of the source address struct, WHERE THE PACKET IS COMING FROM ----*/ 
     /* Address family = Internet */ 
     source.sin_family = AF_INET;  
     /* Set IP address to localhost */ 
     // source.sin_addr.s_addr = INADDR_ANY; 
     /* Set port number, using htons function to use proper byte order */ 
     source.sin_port = htons(43); 



     /* Set all bits of the padding field to 0 */ 
     memset(source.sin_zero, '\0', sizeof source.sin_zero); //optional 


    int i; 
    for (i=0; i<60; i++) { 

     /* creating the socket */   
     if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
      printf("Failed to create socket\n"); 

     /*set the socket options*/ 
     setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)); 



     if(inet_pton(AF_INET, ips[i%3], &source.sin_addr)<=0) //this is where is switch the ip addresses 
     { 
      printf("\n inet_pton error occured\n"); 
      return 1; 
     } 


     /*bind socket to the source WHERE THE PACKET IS COMING FROM*/ 
     if (bind(sock, (struct sockaddr *) &source, sizeof(source)) < 0) 
      printf("Failed to bind socket"); 



     if(inet_pton(AF_INET, "94.198.154.139", &destination.sin_addr)<=0) 
     { 
      printf("\n inet_pton error occured\n"); 
      return 1; 
     } 

     if(connect(sock, (struct sockaddr *)&destination, sizeof(destination)) < 0) 
     { 
      printf("\n Error : Connect Failed \n"); 
      return 1; 
     } 

     printf("check\n"); 

     n = write(sock,"is liveresults.nl\r\n",21); 
     if (n < 0) error("ERROR writing to socket"); 

     while ((n = read(sock, recv_buffer, sizeof(recv_buffer)-1)) > 0) 
     { 
      recv_buffer[n] = 0; 
      if(fputs(recv_buffer, stdout) == EOF) 
      { 
       printf("\n Error : Fputs error\n"); 
      } 
     } 

     if(n < 0) 
     { 
      printf("\n Read error \n"); 
     } 


     close(sock); 

    } 

    return 0; 
} 

編輯:我必須看到,它會減慢afther每一個IP的第一環。因爲我有3個IP地址。在第一輪之後,它會減速每個綁定秒。

+2

我從來沒有聽說過'綁定'需要很長時間才能完成。假設你在Linux上運行,我試着在'strace'下運行你的程序。它可能會讓您對系統調用接口上發生的情況有所瞭解。 'strace -e trace = network my_program'將限制輸出到網絡相關的調用。您應該看到它在任何延遲的系統調用期間暫停打印。 –

+1

這裏有關於需要多長時間的證據完全沒有。你認爲這全都歸因於bind()是沒有根據的。 – EJP

+0

@EJP當我刪除綁定它是快速的,所以我建議綁定放慢一切。 –

回答

0

我必須將本地端口綁定爲0,而不是與出站端口相同的端口。