雜項
C++雜項
Visual studio
- system("pause"); 防止輸出框一閃而過
- F5 執行;F11 逐語句debug; F10逐過程
- F9 新建斷點
void*指標
- 任何型別指標都可以轉為void*,它無條件接受各種型別
- 一般用在通用型介面的引數型別
- 在具體使用時,需要轉化為具體的指標型別
extern "C" : 告訴C++編譯器這段程式碼使用C標準編譯,使得在C和C++混編的情況下兩者得以相容
struct和type struct型別:參考
fprintf :傳送格式化輸出到檔案流 參考
cd - 回到上一目錄
UML類關係圖
C++ try-catch捕獲異常 參考
makefile 教程
- src原始碼 inc標頭檔案 bin執行碼與so檔案 lib靜態/動態庫
- etc配置指令碼 tools/op控制與監控指令碼 log日誌目錄
linux下.a 和.o檔案:
- .a檔案:靜態庫,對函式庫的連結是在編譯期間完成的,程式執行時便和函式庫無關,因為已經拷貝了
- .o檔案:動態庫,庫函式的連結載入推遲到程式的執行時期;可以節省資源,無需每次都載入所有的函式;而且可以實現在程序之間的資源共享
ln命令:為某一個檔案在另一個文職建立一個同步的連結,類似於win下的快捷方式 參考
- 軟連線
- 硬連結
C++中的虛擬函式和純虛擬函式
linux signal函式 參考
http協議:建立在tcp/ip之上的協議,通過TCP連線傳輸資料 參考
Socket 參考
- timeval 結構體 參考 協議實現過程中經常會有同步時間計算獲得時間延遲,一般配合gettimeofday使用
struct timeval { __time_t tv_sec; /* Seconds. */ __suseconds_t tv_usec; /* Microseconds. */ }; #include <iostream> #include "sys/time.h" int main() { struct timeval tv_b, tv_d; unsigned long long timeconsumed = 0; gettimeofday(&tv_b, NULL); for(int i=0;i<100000;i++){} gettimeofday(&tv_d, NULL); timeconsumed = tv_d.tv_sec - tv_b.tv_sec + (tv_d.tv_usec - tv_b.tv_usec)/1000000; std::cout << tv_d.tv_usec - tv_b.tv_usec << std::endl; return 0; }
-
string assign方法:將原字串清空,然後賦予新值進行替換
-
struct in_addr:表示一個32位的ipv4地址 參考
- 網路位元組序:32位的unsigned int,每8位表示IP地址中一個數值;採用大端序(資料的高位在低地址)
struct in_addr {
in_addr_t s_addr;
};
- string c_str():參考 將一個string轉換成const* char(C語言風格的字串)
#include <iostream>
#include <string.h>
int main()
{
std::string s = "1234";
char *p;
// p = s.c_str() //錯誤
p = new char[s.size() + 1];
strcpy(p, s.c_str());
std::cout << p << std::endl;
delete[] p;
return 0;
}
輸出
1234
- inet_ntoa和inet_aton: 參考 將網路位元組序的IP地址和字串表示的點分十進位制IP地址相互轉換
#include <iostream>
#include <stdlib.h>
#include <arpa/inet.h>
int main()
{
char IP[] = "127.0.0.1";
in_addr address;
int number = inet_aton(IP, &address);
std::cout << number << std::endl;
std::cout << address.s_addr << std::endl;
std::cout << inet_ntoa(address) << std::endl;
return 0;
}
輸出
1
16777343
127.0.0.1
time(0) 返回系統時間(從1970.1.1開始算起,since epoch),單位:秒 參考
- inet_addr:將點分十進位制的字串轉換為網路位元組序
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <arpa/inet.h>
using namespace std;
int main(){
int val;
char str[] = {"127.1.0.1"};
val = inet_addr(str);
printf("val: %d\n", val);
return 0;
}
-
netstat -an | grep tcp 檢視當前網路的TCP連線
-
netstat -lnp 檢視網路連線(推薦)
-
tcpdump tcp -i any port 32323 -A -s 512 -nn 抓包分析
-
strcmp : 字串比較
-
strstr:查詢字串第一次出現的位置;strcasestr:查詢字串第一次出現的位置,無視大小寫
-
memset:字串複製函式
-
strtol:將字串根據給定的進位制轉換成long int型
-
memmove(str1, str2, n):從str2中複製n個字元到str1
-
sprintf(str1, st2):傳送格式化輸出str2到str1
-
fread() :讀取檔案流
-
rm core* 刪除所有帶core的檔案
-
core檔案:參考 程式執行期間發生了segment fault段錯誤,作業系統會把此程式當前的記憶體資訊dump到磁碟上,即生成core檔案,可以使用gdb對core檔案進行分析出程式crash的地方。core檔案表明程式出現了嚴重的錯誤,需要詳細的debug
-
Fiddler,參考 一個http的除錯代理,以代理伺服器的方式監聽系統的http網路資料流動。
-
.a和.so 靜態庫與動態庫:參考
-
makefile 中隱式規則 參考 CXX=g++
-
assert : 斷言,用於除錯程式和檢查錯誤;一般用於檢驗引數的合法性,但是頻繁的呼叫assert會極大影響程式的效能,增加額外的開銷
-
strtok:與要搜尋的字串的順序無關
#include <stdlib.h> using namespace std; int main(){ char method[100]; char filename[100]; char buffer[] = "GET /index.html HTTP/1.1\r\n"; strcpy(method, strtok(buffer, " /")); strcpy(filename, strtok(NULL, "/ ")); //strcpy(filename, strtok(NULL, " /")); printf("%s, %s\n", method, filename); return 0; }
-
主機位元組序與網路位元組序:參考
htonl, htons, ntohl, ntohs h表示主機,n表示網路,l表示整形long,s表示短整型short
#include <stdlib.h> #include <arpa/inet.h> using namespace std; int main(){ unsigned long a = 0x12345678; unsigned char *p = (unsigned char*)(&a); printf("主機位元組序:%0x, %0x, %0x, %0x\n", p[0], p[1], p[2], p[3]); printf("主機位元組序數字大小: %d\n", a); unsigned long b = htonl(a); printf("網路位元組序數字大小: %d\n", b); p = (unsigned char*)(&b); printf("網路位元組序:%0x, %0x, %0x, %0x\n", p[0], p[1], p[2], p[3]); return 0; }
-
IP地址與網路位元組序 參考
#include <netinet/in.h> using namespace std; int main(){ struct in_addr ipaddr; unsigned int addr = inet_addr("127.0.0.1"); printf("addr = %d\n", ntohl(addr)); ipaddr.s_addr = addr; //addr為網路位元組序 printf("%s\n", inet_ntoa(ipaddr)); return 0; }
-
棧記憶體和堆記憶體:參考 new出來的物件儲存在堆記憶體中,直接定義的陣列儲存在棧記憶體中;棧記憶體很小,32M,但是速度快;當需要大的buffer時,要new出來,而不是直接char *;不然會報segment fault段錯誤
-
fread的r和rb模式:對於普通文字使用r,圖片使用rb;使用r會遺漏某些控制的字元
-
.gitignore忽略檔案:參考
-
coderunner使用C++11標準 參考