2014-04-22 55 views
0

我正在實施一個聊天室應用程序,使用C語言的原始套接字用於我的大學項目。我在分配IP地址時遇到了問題。在IP頭中分配IP地址C

數據包從套接字接收。我正在解析它,如圖所示。現在如何分配IP地址。

我寧願按照所示的方式(如果可能,使用rcv_ip作爲字符)來完成它。所以在給出使用struct in_addr的建議之前,請幫助我解決這個問題。因爲我嘗試過其他方法,這些方法正在進一步給我造成困惑。

main() 
{ 
char *rcv_ip; 
char *packet; 
int len; 
struct iphdr ip_header; 
rcv_ip=ParseIPHeader(packet,len); 
printf("\n %s ",rcv_ip); //printing some junk 
printf("\n %s ",inet_addr(rcv_ip)); //giving seg fault 
printf("\n %s",inet_ntoa(*((struct in_addr*)ip_header->daddr))); //printing correct ip 

ip_header CreateIPHeader(rcv_ip+5,rcv_ip); 
} 

現在是ParseIPHeader函數。

char *ParseIPHeader(packet,len) 
{ 
    struct iphdr *ip_header; 
    struct ethhdr *eth_header; 
    char *ret_ip; 

    ip_header=(struct iphdr *)(packet+sizeof(struct ethhdr)); 
    ret_ip=malloc(10); 
    memset(ret_ip,0,10); 
    memcpy(ret_ip,&(ip_header->daddr),sizeof(ip_header->daddr)); 
    memcpy(ret_ip+5,&(ip_header->saddr),4); 

    return ret_ip; 
} 

struct iphdr *CreateIPHeader(char *src_ip,char *dst_ip) 
{ 
    struct iphdr *ip_header; 
ip_header=malloc(sizeof(struct iphdr)); 
    //main part. How to do this?? 
    ip_header->saddr = inet_addr(src_ip); //please correct it. 
ip_header->daddr = inet_addr(dst_ip); 


return(ip_header); 
} 

謝謝:)

回答

0

你似乎期望IP地址字符串,因爲你嘗試打印一個與printf()%s格式說明。這是不正確的; IP地址在標頭中是二進制的。

這意味着IPv4地址只使用32位,而文本表示可能最多使用3 + 1 + 3 + 1 + 3 + 1 + 3 = 15個字符(加終止符,所以爲16)。

閱讀更多IP基礎知識。

+0

是的..謝謝。這意味着我必須使用一些包含ipaddress的結構體。會**結構in_addr **沒問題?我想我需要這個結構的兩個對象,然後分配源IP和目標IP。但我將如何從** CreateIPHeader **函數返回兩個IP? – user3542109