2013年8月15日 星期四

: error LNK2019: 无法解析的外部符号

使用 <winsock.h> 需要 WS2_32.LIB

◎在VS2012中link WS2_32.lib

方法一: Configuration properties - Linker - Input - Additional Dependencies.
方法二: #pragma comment(lib, "ws2_32.lib")




資料來源:
------------------------
1. http://bbs.csdn.net/topics/40238982
2. http://social.msdn.microsoft.com/Forums/vstudio/en-US/cfefa4a5-1f1a-4987-8bc7-f3197cb5826c/how-to-link-ws232lib

2013年8月8日 星期四

winsock2.h 和 windows.h ─ error C2375 重複定義



這兩個header檔案內部似乎有定義相同的東西,
 
順序沒弄好會有 "error C2375 : 重複定義 連結規範不相同"
 
盡量不要兩者include,
 
若一定得需要,
 
確認include的順序是:
 
先include <winsock2.h> , 再include <windows.h> !!!


-------------
資料來源:

2013年8月5日 星期一

ntohs, ntohl, htons,htonl的比較

ntohs =net to host short int 16位
htons=host to net short int 16位
ntohl =net to host long int 32位
htonl=host to net long int 32位
ntohs簡述:
將一個無符號短整形數從網絡字節順序轉換為主機字節順序。
    #include 
    u_short PASCAL FAR ntohs( u_short netshort); 
    netshort:一個以網絡字節順序表達的16位數。
註釋:
    本函數將一個16位數由網絡字節順序轉換為主機字節順序。
返回值:ntohs()返回一個以主機字節順序表達的數。
htons簡述:
將主機的無符號短整形數轉換成網絡字節順序。
    #include 
    u_short PASCAL FAR htons( u_short hostshort); 
    hostshort:主機字節順序表達的16位數。
註釋:
    本函數將一個16位數從主機字節順序轉換成網絡字節順序。
返回值: htons()返回一個網絡字節順序的值。
=================================================
這2個函數提供了主機字節順序與網絡字節順序的轉換
比如網絡字節為00 01
u_short a;如何直接對應的話a=0100; 為什麼呢?因為主機是從高字節到低字節的,所以應該轉化後
a= ntohs (0001);這樣a=0001;
首先,假設你已經有了一個sockaddr_in結構體ina,你有一個IP地址”132.241.5.10″要儲存在其中,你就要用到函數inet_addr(),將IP地址從點數格式轉換成無符號長整型。使用方法如下:
ina.sin_addr.s_addr = inet_addr(“132.241.5.10″); 
注意,inet_addr()返回的地址已經是網絡字節格式,所以你無需再調用函數htonl()。
我們現在發現上面的代碼片斷不是十分完整的,因為它沒有錯誤檢查。顯而易見,當inet_addr()發生錯誤時返回-1。記住這些二進制數字?(無符號數)-1僅和IP地址255.255.255.255相符合!這可是廣播地址!大錯特錯!記住要先進行錯誤檢查。
好了,現在你可以將IP地址轉換成長整型了。有沒有其相反的方法呢?它可以將一個in_addr結構體輸出成點數格式?這樣的話,你就要用到函數inet_ntoa()(“ntoa”的含義是”network to ascii”),就像這樣:
printf(“%s”,inet_ntoa(ina.sin_addr)); 
它將輸出IP地址。需要注意的是inet_ntoa()將結構體in-addr作為一個參數,不是長整形。同樣需要注意的是它返回的是一個指向一個字符的指針。它是一個由inet_ntoa()控制的靜態的固定的指針,所以每次調用inet_ntoa(),它就將覆蓋上次調用時所得的IP地址。例如:
char *a1, *a2; 
a1 = inet_ntoa(ina1.sin_addr); /*這是198.92.129.1 */ 
a2 = inet_ntoa(ina2.sin_addr); /*這是132.241.5.10 */ 
printf(“address 1 : %s “,a1); 
printf(“address 2: %s “,a2); 
輸出如下:
address 1: 132.241.5.10 
address 2: 132.241.5.10 
假如你需要保存這個IP地址,使用strcopy()函數來指向你自己的字符指針。
==================================================
htonl()表示將32位的主機字節順序轉化為32位的網絡字節順序htons()表示將16位的主機字節順序轉化為16位的網絡字節順序(ip地址是32位的端口號是16位的)
inet_ntoa() 
簡述:
    將網絡地址轉換成“.”點隔的字符串格式。
    #include
    char FAR* PASCAL FAR inet_ntoa( struct in_addr in);
    in:一個表示Internet主機地址的結構。
註釋:
    本函數將一個用in參數所表示的Internet地址結構轉換成以“.”間隔的諸如“abcd”的字符串形式。請注意inet_ntoa()返回的字符串存放在WINDOWS套接口實現所分配的內存中。應用程序不應假設該內存是如何分配的。在同一個線程的下一個WINDOWS套接口調用前,數據將保證是有效。
返回值:
    若無錯誤發生,inet_ntoa()返回一個字符指針。否則的話,返回NVLL。其中的數據應在下一個WINDOWS套接口調用前複製出來。
參見:
    inet_addr().
測試代碼如下
include 
#include 
#include 
#include 
#include 
int main(int aargc, char* argv[]) 

         struct in_addr addr1,addr2; 
         ulong l1,l2; 
         l1= inet_addr(“192.168.0.74″); 
         l2 = inet_addr (“211.100.21.179″); 
         memcpy(&addr1, &l1, 4); 
         memcpy(&addr2, &l2, 4); 
         printf(“%s : %s “, inet_ntoa(addr1), inet_ntoa(addr2)); //注意這一句的運行結果
         printf(“%s “, inet_ntoa(addr1)); 
         printf(“%s “, inet_ntoa(addr2)); 
         return 0; 

實際運行結果如下:
192.168.0.74 : 192.168.0.74 //從這裡可以看出,printf裡的inet_ntoa只運行了一次。
192.168.0.74 
211.100.21.179
inet_ntoa返回一個char *,而這個char *的空間是在inet_ntoa裡面靜態分配的,所以inet_ntoa後面的調用會覆蓋上一次的調用。第一句printf的結果只能說明在printf裡面的可變參數的求值是從右到左的,僅此而已。

資料來源:blog.chinaunix.net/
http://my.oschina.net/alphajay/blog/4277

2013年4月8日 星期一

Regular Expression: Regex 所使用的符號彙整


Regex 所使用的符號彙整

Regex 的 Notation 列表:
記號 說明
字元 代表該字元, 例如輸入 a 就代表那個地方應該出現 a 這個字元
^ 限制字串必須出現於行首, 例如 ^a 表這串字必須以 a 開頭; 如果 a 出現在其它地方, 都不算數
$ 限制字串必須出現於行末, 例如 a$ 表這串字必須以 a 結尾; 如果 a 出現在其它地方, 都不算數
\ 將特殊字元還原成字面意義的字元, 例如 \( 代表 ( 這個符號, \\ 代表 \ 這個符號; 這種表示法適用於 (, ), [, ] 等在 Regex 有特殊意義的字元
^ 某字元以外的任何字元, 必須包在中括號裡面。例如 [^a] 表示 a 除外的任何字元或符號, [^a\t] 表示 a 和 tab 除外的任何字元或符號
- 字元集合中可使用 - 來指定字元的區間, 必須包在中括號裡面。例如 [a-z] 表示從 a 到 z 的英文小寫字元, [1-3] 表示從 1 到 3 這三個數字之一
+ 其前的字元或字元集合出現一次或一次以上, 例如 a+
? 其前的字元或字元集合可出現一次或不出現, 例如 a?
* 其前的字元或字元集合可出現任何次數或不出現, 例如 a*
(...) 用以括住一群字元,且將之視成一個集合, 通常用來集合表示多個檢核式
{n} 重複 n 次
{n,m} 重複 n 到 m 次
{n,} 至少重複 n 次
[] 其中之一字元可出現可不出現, 例如 [abc] 表示不論出現 a 或 b 或 c 都算符合
| 代表「或」, 例如 (Sun|Mon|Tue|Wed|Thu|Fri|Sat), (日|一|二|三|四|五|六) ; 必須以左右括號括住
. (句點符號) 代表除了換行符號 (\n) 以外的任一字元。如果要包括換行符號, 請使用 [\s\S]
\w (\W) 代表任何英文(以外的) 字元 - 請注意, 數字字元也被承認
\s (\S) 代表空白 (以外的) 字元
\d (\D) 代表數字 (以外的) 字元
\b (\B) 代表位於文字邊界的 (以外的) 字元, 例如 \bA 可以檢核出 AB, A\b 可以檢核出 BA, \bAA\b 可以檢核出 AA
\r 代表換行字元 (或稱 CR, Carriage Return)
\n 代表換行字元 (或稱 LF, Line Feed; 通常和 \r 一同出現, 所以一般以 \r\n 代表換行, 但根據我的測試, 無論使用 \r 或 \n 或 \r\n 都會得到相同的結果, 但唯獨不能寫成 \n\r, 但建議使用 \r?\n)
\t 代表 TAB 字元 (或稱 HT, Horizontal Tab)
\( 代表左括號
\) 代表右括號
\x 以十六進位字元碼代表某個字元; 例如 [\x21-\x7E] 可代表所有看得到的字元 ([\x20-\x7E] 則包括空白字元)。不過注意 \x 之後要使用兩個數字, 不足兩個數字者請補 0, 例如 \x01
\1, \2... (Backreference Constructs) 表示出現過的群組; 例如 "(\d)(\D)" 樣式中有兩個群組, 若使用 "(\d)(\D)\1" 可檢出 "2A3"; 若使用 "(\d)(\D)\2+" 則可檢出 "2AB"; 餘此類推
\k<name> 同上, 但適用於命名的群組; 例如 "(?<Digit>\d)(?<NonDigit>\D)\k<Digit>" 亦可檢出 "2A3"
\p{Lu} (\P{Lu}) 檢出大寫(非大寫)的字母, 例如 (?-i:\p{Lu}) 可檢出字串中所有大寫字母, 而 (?-i:\P{Lu}) 可檢出所有非大寫 (包括數字、空白等) 的字母





資料來源:
Regex入門 http://www.dotblogs.com.tw/johnny/archive/2010/01/25/13301.aspx
Regex進階 http://www.dotblogs.com.tw/johnny/archive/2010/03/02/13855.aspx

2013年3月6日 星期三

Linux C

1.select
2.read
3.write
4.RS232 設計
http://www.vr.ncue.edu.tw/esa/EmbeddedSystemProgramming2010/ch06.htm

相關文章
教學文
http://www.vr.ncue.edu.tw/esa/EmbeddedSystemProgramming2010/

Source Insight 相關文章

Source Insight 3.5

相關文章
new project http://welkinchen.blogspot.tw/2009/10/source-insight.html
1.Source Insight 教學收集
http://huenlil.pixnet.net/blog/post/23271746

2.Source Insight - Trace Code的神兵利器http://www.wretch.cc/blog/hidex/8117748

3.sourceinsight使用技巧http://blog.csdn.net/flyyanqu/archive/2008/03/27/2222799.aspx

4.SourceInsight的实用技巧http://blog.csdn.net/jupin/archive/2007/10/19/1832536.aspx

5.Source Insight3.0: Linux源代码阅读的利器, http://www.itepub.net/html/kaifawendang/caozuoxitong/Linux/ruanjianshiyong/2006/0501/14338.html

Ubuntu root login

Terminal權限修改

  • sudo -i    //直接設定權限登入為root (需輸入該使用者密碼)
  • sudo passwd root  //設定root密碼
    su root //切換身份為root權限 (需輸入剛設定的root密碼)


系統登入畫面

  • version 12.10
    1.sudo passwd root  //設定root密碼
    2.sudo sh -c 'echo "greeter-show-manual-login=true" >> /etc/lightdm/lightdm.conf'   //修改登入畫面
    3.reboot 登入畫面多出"登入"選項
    4.點選"登入" >> 輸入root及剛設定的root密碼



相關文章

12.10
http://www.liberiangeek.net/2012/10/quickly-enable-root-login-in-ubuntu-12-10-quantal-quetzal/

12.04 / 11.10
http://ubuntuguide.net/enable-login-as-root-in-ubuntu-12-0411-10-with-lightdm