在学习完孙鑫老师的网络聊天室部分后,现总结如下:
使用套接字(UDP)的顺序如下:
1 加载套接字库
BOOL AfxSocketInit(
WSADATA* lpwsaData = NULL
);
它负责加载套接字库,并进行版本协商。
2 创建套接字
SOCKET WSAAPI socket(
_In_ int af,//地址家族
_In_ int type,//通信协议类型
_In_ int protocol
);
3 绑定套接字
int bind(
_In_ SOCKET s,
_In_ const struct sockaddr *name,//指向绑定的套接字的一些信息
_In_ int namelen
);
struct sockaddr_in {//本地的套接字地址信息
short sin_family;
u_short sin_port;//端口,需要将主字节序改为网络字节序hton(sl)
struct in_addr sin_addr;//需要将主字节序改为网络字节序hton(sl)
char sin_zero[8];
};
typedef struct in_addr {//IP地址的表示形式
union {
struct {
u_char s_b1,s_b2,s_b3,s_b4;
} S_un_b;
struct {
u_short s_w1,s_w2;
} S_un_w;
u_long S_addr;
} S_un;
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
4接受数据(在这个程序中将该函数包含在线程的入口函数实现方法中)//由于在等待数据的过程中,recvfrom函数易发生堵塞(需要时间等待外界的输入)故多线程非常适用
int recvfrom(
_In_ SOCKET s,//本地已绑定的套接字
_Out_ char *buf,//存放接受的字符
_In_ int len,//buf长度
_In_ int flags,
_Out_ struct sockaddr *from,//存放发送端的套接字信息
_Inout_opt_ int *fromlen//sockaddr长度
);
附:
char* FAR inet_ntoa(//将网络字节序转变为ASCII字符串 _In_ struct in_addr in );
5 发送数据
int sendto(
_In_ SOCKET s,//链接的套接字
_In_ const char *buf,//即将发送的字符串
_In_ int len,//字符串长度
_In_ int flags,
_In_ const struct sockaddr *to//发送信息的目的地址(的套接字信息),
_In_ int tolen//套接字信息长度
);
值得说明的是:
1 在编写程序的过程中,用户自建消息并进行投射是很重要的。
2 在编写的过程中遇到了很多错误,总结一下。
错误1:
VS2008LINK : fatal error LNK1000: Internal error during IncrBuildImage
解决方法:修改链接选项,方法:项目->属性->链接器->常规 下面的“启用增量链接”,将“是(/INCREMENTAL)”改为“否(/INCREMENTAL:NO)”,然后确 定就可以了。
错误2:
general error c101008a: Failed to save the updated manifest to the file
解决方法:VS2008下,生成--->清理解决方案
错误3:
error C2664: strcpy : 不能将参数 2 从 CString 转换为 const char *
解决方法:参见CString 、string与char*的区别。
Reference: