Preparations :VS2015安装问题
- 安装时如果选择默认选项安装,则不会包含创建C++工程模板,需要下载,但不需要重新安装。
选择打开devenv.exe,则可以点击相应模板进行下载。注意,打开Blend.exe下则不会出现未下载模板对应点击安装项。
1.MFC工程创建
MFC ActiveX 是创建一个ActiveX工程的意思,就是说你创建的工程最后生成的是一个ActiveX文件
MFC Application 是创建一个MFC应用程序的意思,你最后生成的文件应该是以exe类型的
MFC Dll 是创建一个支持MFC的Dll的意思,就是你最后生成的就是一个动态连接库,Dll文件
2. MFC使用Addstring()函数乱码
LPCTSTR用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
强制类型转换会出现乱码
解决办法:
VS属性->配置属性->常规->字符集
改为使用多字节字符集
3. fscanf()和fscanf_s()用法的比较
- fscanf():fscanf(fp,"%d",&var);
- fscanf_s():fscanf(fp,"%d",&var,sizeof(int));
区别:fscanf_s需要指定长度
4.添加动态库
VSVS属性->配置属性->输入->附加依赖项
输入ws2_32.lib
5.PF_NET和AF_NET区别
在windows中的Winsock2.h中
#define AF_INET 0
#define PF_INET AF_INET
所以在windows中AF_INET与PF_INET完全一样
6.向线程函数传递多个参数
解决办法:把要传递的参数放到一个结构体中,然后把结构体变量当成参数传进去
例:
#include <stdio.h>
#include <windows.h>
typedef struct test
{
int n;
char c;
char a[100];
}Test;
DWORD WINAPI ThreadFun(LPVOID pM)
{
Test *pt = (Test *)pM;
printf("%d, %c, %s\n", pt->n, pt->c, pt->a);
return 0;
}
int main()
{
printf("main thread\n");
Test t;
t.n = 1;
t.c = 'x';
memset(t.a, 0, sizeof(t.a));
strncpy(t.a, "so great", sizeof(t.a) - 1);
HANDLE handle = CreateThread(NULL, 0, ThreadFun, (LPVOID)&t, 0, NULL);
CloseHandle(handle);
Sleep(2000);
return 0;
}
7.关于VS2015不能使用inet_addr()函数的问题
解决办法:
解决方法:项目->项目属性->c/c++->常规->SDL检查改为“否”
8.关于粘包、分包、解包问题
解决办法:
创建RingBuf(环形缓冲),修改通信协议(添加len长度字段)。由于数据包可能被分为两个,导致添加的标识数据包长度len字段读取发生错误,故采用环形缓冲,使得前后两个被分开的数据包合成一个。
通信协议序列化:
参考链接:http://mp.weixin.qq.com/s?__biz=MzAxNDI5NzEzNg==&mid=2651157407&idx=1&sn=16ea3f89f9ccbeede7b223597cfc7de0&chksm=8064a2c0b7132bd64b549adcee3d4147d0d4ab1da8682c1ff93ea51eadc0eba6526a5dc88a06&mpshare=1&scene=23&srcid=0328r5thXiK5SSGlJZr7huGT#rd