使用 <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月15日 星期四
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()返回一個以主機字節順序表達的數。
#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()返回一個網絡字節順序的值。
#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()函數來指向你自己的字符指針。
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套接口調用前,數據將保證是有效。
本函數將一個用in參數所表示的Internet地址結構轉換成以“.”間隔的諸如“abcd”的字符串形式。請注意inet_ntoa()返回的字符串存放在WINDOWS套接口實現所分配的內存中。應用程序不應假設該內存是如何分配的。在同一個線程的下一個WINDOWS套接口調用前,數據將保證是有效。
返回值:
若無錯誤發生,inet_ntoa()返回一個字符指針。否則的話,返回NVLL。其中的數據應在下一個WINDOWS套接口調用前複製出來。
若無錯誤發生,inet_ntoa()返回一個字符指針。否則的話,返回NVLL。其中的數據應在下一個WINDOWS套接口調用前複製出來。
參見:
inet_addr().
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
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
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/
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
相關文章
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權限修改
系統登入畫面
相關文章
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
- 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
訂閱:
文章 (Atom)