2012年5月25日 星期五

ipv6位址比較

ipv4因為sin_addr中s_addr結構為uint32,可以利用"等於"直接作位址比較。

typedef uint32_t in_addr_t;
struct in_addr {
in_addr_t s_addr; /* IPv4 address */
};

比較方式可以像下面這樣。

(sa->sin_addr.s_addr != (((struct sockaddr_in *)&remote)->sin_addr.s_addr))

但是v6中sin6_addr就長得不太一樣了。

struct in6_addr {
union {
uint8_t u6_addr8[16];
uint16_t u6_addr16[8];
uint32_t u6_addr32[4];
} in6_u;

    #define s6_addr in6_u.u6_addr8
    #define s6_addr16 in6_u.u6_addr16
    #define s6_addr32 in6_u.u6_addr32
};

可以看到是使用陣列方式儲存。比較的話要使用memcmp方式來達成。

memcmp(sa_v6->sin6_addr.s6_addr, (((struct sockaddr_in6 *)&remote)->sin6_addr.s6_addr), 16) != 0

這個問題的來源可以參考Comparing a peer's IPv6 address with localhost

2012年5月24日 星期四

Porting applications to IPv6 HowTo

這次是要在linux下將ipv4的程式改成ipv4/ipv6相容的程式。

原文可以看Porting applications to IPv6 HowTo

首先利用sockaddr_storage取代傳統的sockaddr_in。當使用ipv4做溝通時,就將這個struct轉為sockaddr_in,使用ipv6溝通時,就要轉換為sockaddr_in6。sockaddr_storage裏面構造長得很像sockaddr_in和sockaddr_in6。

#if ULONG_MAX > 0xffffffff
# define __ss_aligntype __uint64_t
#else
# define __ss_aligntype __uint32_t
#endif
#define _SS_SIZE 128
#define _SS_PADSIZE (_SS_SIZE - (2 * sizeof (__ss_aligntype)))

struct sockaddr_storage
{
sa_family_t ss_family; /* Address family */
__ss_aligntype __ss_align; /* Force desired alignment. */
char __ss_padding[_SS_PADSIZE];
};

當我要使用的時候,我可以預先做轉好的動作備用。

struct sockaddr_storage sa;
struct sockaddr_in *sa_v4 = (struct sockaddr_in *)&sa;
struct sockaddr_in6 *sa_v6 = (struct sockaddr_in *)&sa;

或是你需要用的時候再做轉換。

(((struct sockaddr_in *)&sa)->sin_addr.s_addr)     --->v4
(((struct sockaddr_in6 *)&sa)->sin6_addr.s6_addr) --->v6

接著,記得系統要build好ipv6的module,那樣的話,bind, recv這些通訊方法通通不用改。


而要分辨現在溝通模式是v4還是v6,可以看ss_family。

if(sa.ss_family == AF_INET){
...
}else if(sa.ss_family == AF_INET6){
...
}

最後就要有耐心的補完v6的邏輯。因為網路位址轉字串,位址比較都和v4不相同。詳細範例可以再看前面提到的Porting applications to IPv6 HowTo

(pre)Maturely Optimize Your JavaScript

http://msdn.microsoft.com/zh-tw/magazine/gg622887(en-us).aspx

這篇說到javasscript運行的最佳化。

裡面說了一些觀念。不要為了很少執行到的程式作最佳化。在寫程式時就要想好比較省的想法。

舉了一些範例。
1. loop減少function call的重複性呼叫。
2. 最好一次把資料準備好再一次做function call處理,減少iteration。
3. jQuery loop最好把需要重複做"一樣"select的結果保存下來,避免重複做select動作。

2012年5月20日 星期日

Cross-domain Ajax: Implementation and Considerations

http://msdn.microsoft.com/zh-tw/magazine/gg624360(en-us).aspx

javascript由於安全性限制,跨站抓取資料一般而言是不可行的。想要達到Cross domain的資料交換,這裡舉出了一些可行的作法。

1. 利用代理伺服器方式取得
2. 利用<script>方式,引入外部網址script,並將資料用json方式包覆
3. flash或silverlight第三方元件
4. 還不成熟的CORS(Cross-Origin Resource Sharing)標準

基本上作者是建議用2以滿足現階段的環境使用啦。

2012年5月17日 星期四

JavaScript Attack/Defend

http://msdn.microsoft.com/zh-tw/magazine/hh243615(en-us).aspx

對於幹壞事而言一直有莫名的動力在。XSS出來很久了,我也一直努力想辦法在我們device裡面進行XSS攻擊。現在為止還沒有成功。現在卡在可動用字串長度太短。

防禦方式就從js與server端的檢查下手。

對於XSS更容易了解的範例,可以看XSS(Cross Site Scripting)攻擊會讓您遺失Cookie中的資料

2012年5月16日 星期三

How to Debug Your jQuery Code

http://msdn.microsoft.com/en-us/magazine/ee819093.aspx

這篇文章很清楚的描述了如何去利用Firebug及一些plugin套件去對jQuery的script作debug,非常有用。

大綱項目如下
1. FireBug
2. FireQuery
3. FireFinder
4. JQuery Trace插件使用
5. 使用中斷點察看js
6. 查看event原始觸發者
7. 查看事件觸發堆疊 (console.group, console.groupEnd)
8. 計算程式區塊執行時間 (console.time, console.timeEnd)
9. 查看json與ajax溝通
10. 使用條件式中斷

另外也推薦jsbin作為javascript沙盒的快速產生預覽,這樣就不用辛苦的寫測試html了。

2012年5月4日 星期五

c使用regular expression提取字串

在石頭閒語的"在 C 程式中,使用 Regex (Regular Expression) library" http://blog.roodo.com/rocksaying/archives/3866523.html 看到,試著編譯一下,挺實用的。

特地引用原始碼,以後會用到。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <regex.h>

int main() {
regex_t preg;
regmatch_t pmatch[10];
size_t nmatch = 10;
int cflags = REG_EXTENDED | REG_ICASE;
int i, len, rc;
char buf[1024], reg[256], str[256];

while(1) {
printf("Input exp: ");
fgets(reg, 256, stdin);
if(reg[0] == '\n') break;
strtok(reg,"\n");

printf("Input str: ");
fgets(str,256,stdin);
if(str[0] == '\n') break;
strtok(str,"\n");

if( regcomp(&preg, reg, cflags) != 0 ) {
puts("regex compile error!\n");
return 1;
}

rc = regexec(&preg, str, nmatch, pmatch, 0);
regfree(&preg);

if (rc != 0) {
printf("no match\n");
continue;
}

for (i = 0; i < nmatch && pmatch[i].rm_so >= 0; ++i) {
len = pmatch[i].rm_eo - pmatch[i].rm_so;
strncpy(buf, str + pmatch[i].rm_so, len);
buf[len] = '\0';
printf("sub pattern %d is %s\n", i, buf);
}
}

return 0;
}