這是最近做演習項目接觸到的結束點的一個小結。s
1. socket通信的常用流程(tcp/ip):<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
2.windows socket 和linux socket的不同
⑴socket版本初始化
windows:調用函數WSAStartup初始化socket版本後,纔可以使用socket/bind等socket函數。
linux:不需要初始化socket版本
⑵頭文件引用
windows:
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
注:windows.h一定要放在winsock2.h後面,不然編譯的時候會報宏重定義錯誤。
linux:
#include <sys/socket.h>
⑶socket 句柄類型
windows:SOCKET
linux: int
⑷socket關閉函數
windows:closesocket
linux:close
⑸socket錯誤信息取得
windows:調用WSAGetLastError()取得當前錯誤碼
linux:直接從系統變量errno中取得,調用strerror()把錯誤碼轉換爲對應錯誤信息
⑹getaddrinfo函數的使用
windows:引用頭文件winsock2.h windows.h Ws2tcpip.h
linux:引用頭文件件 sys/types.h sys/socket.h netdb.h unistd.h
3. cygwin gcc與linux gcc的不同
⑴cygwin gcc 中函數getaddrinfo是在w32API中,所以使用該函數的場合,必須區分windows/linux,不能使用共同的代碼。
⑵頭文件dirent.h中函數使用到的結構體struct dirent的定義不同。cygwin中使用的結構體中沒有文件類型。(dirent.h中的函數是用戶目錄操作的)
4.linux c字符編碼轉換
⑴linux 默認字符集取得
調用函數getenv可以從語言環境變量LANG中取得,格式爲:語言.字符集
⑵字符編碼轉換函數
函數原型:
iconv_t iconv_open(const char *tocode, const char *fromcode)
size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf,size_t *outbytesleft)
int iconv_close(iconv_t cd)
函數說明:
iconv_t iconv_open指定轉換的兩種碼制,生成轉換句柄(返回值)。tocode:目的編碼,fromcode:原編碼
iconv編碼轉換,返回轉換的字符數,可逆的轉換不計入(可逆的轉換即不需要轉換的字符)。cd爲轉換句柄即iconv_open函數的返回值,後四個參數都既是輸入參數也是輸出參數。輸入參數的場合:輸入字符串,輸入字符串長度,輸出buff,輸出buff的size;輸出參數的場合: 指向還未轉換的字符,還未轉換的字符數,轉換後字符串的尾部,輸出buff的剩餘空間的字節數,兩個char *指針分別指向轉換後字符串的尾部。
iconv_close關閉轉換句柄。
5.windows動態庫和linux動態庫的區別
⑴函數聲明和定義
windows:頭文件中,函數聲明如下:
#ifndef AGLOG_C //在對應.c文件的開頭定義
#ifdef __cplusplus //C++調用的場合,使用c的object格式
extern "C" {
#endif
// __declspec(dllimport)__stdcall 是windows動態庫函數標識關鍵字
int __declspec(dllimport)__stdcall aglog_init(void);
#ifdef __cplusplus
}
#endif
#endif
在實現文件中動態庫關鍵字對應爲__declspec(dllexport)__stdcall
linux:
和一般函數沒有區別
⑵引用方式(顯式)
windows:引用對應的靜態庫
說明:windows動態庫編譯時也會生成一個.lib文件,即我們上面所說的“對應的靜態庫”。在這裏更確切的應該叫導入庫(Import Library),而我們平常所說的靜態庫叫對象庫(Object Library)。導入庫是一種比較特殊的對象庫文件,它與一個動態庫相對應,且僅在程序編譯連接的場合使用,被鏈接器用來解析函數調用。但是,導入庫不包含代碼,它只爲鏈接器提供動態鏈接庫的信息,以便於鏈接器對動態鏈接庫中的對象作恰當地鏈接。
linux:在gcc命令以-l參數引用動態庫