这是最近做演习项目接触到的结束点的一个小结。s
1. socket通信的常用流程(tcp/ip):
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参数引用动态库