Windows网络编程中遇到的一些问题和注意事项

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属性->配置属性->常规->字符集
改为使用多字节字符集


Windows网络编程中遇到的一些问题和注意事项_第1张图片
多字符集1

Windows网络编程中遇到的一些问题和注意事项_第2张图片
多字符集2

Windows网络编程中遇到的一些问题和注意事项_第3张图片
多字符集3

3. fscanf()和fscanf_s()用法的比较

  1. fscanf():fscanf(fp,"%d",&var);
  1. fscanf_s():fscanf(fp,"%d",&var,sizeof(int));
    区别:fscanf_s需要指定长度

4.添加动态库

VSVS属性->配置属性->输入->附加依赖项
输入ws2_32.lib


Windows网络编程中遇到的一些问题和注意事项_第4张图片
链接动态库

5.PF_NET和AF_NET区别

在windows中的Winsock2.h中

#define AF_INET 0
#define PF_INET AF_INET

所以在windows中AF_INET与PF_INET完全一样

6.向线程函数传递多个参数

解决办法:把要传递的参数放到一个结构体中,然后把结构体变量当成参数传进去
例:

#include   
#include   
  
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检查改为“否”


Windows网络编程中遇到的一些问题和注意事项_第5张图片
inet_addr 1

Windows网络编程中遇到的一些问题和注意事项_第6张图片
inet_addr 2

Windows网络编程中遇到的一些问题和注意事项_第7张图片
inet_addr 3

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

你可能感兴趣的:(Windows网络编程中遇到的一些问题和注意事项)