技術小結

這是最近做演習項目接觸到的結束點的一個小結。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/bindsocket函數。

   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關閉函數

    windowsclosesocket

    linuxclose

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 gcclinux 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,輸出buffsize;輸出參數的場合: 指向還未轉換的字符,還未轉換的字符數,轉換後字符串的尾部,輸出buff的剩餘空間的字節數,兩個char *指針分別指向轉換後字符串的尾部。

    iconv_close關閉轉換句柄。

5.windows動態庫和linux動態庫的區別

  函數聲明和定義

  windows:頭文件中,函數聲明如下:

#ifndef AGLOG_C //在對應.c文件的開頭定義

                     #ifdef          __cplusplus //C++調用的場合,使用cobject格式

                         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參數引用動態庫

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章