1.套接字(句柄)
2.数据初始化
memset(&_mDataOfCfg, 0, sizeof(_mDataOfCfg));
3.文件目录(当前工作目录)
const char ConfigFile[]= "..\\Debug\\config.cfg";
4.网络地址(网络字节序)
htons() 把unsigned short类型从主机序转换到网络序;
htonl() 把unsigned long类型从主机序转换到网络序;
ntohs() 把unsigned short类型从网络序转换到主机序;
ntohl() 把unsigned long类型从网络序转换到主机序。
SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_port = htons(5000);
addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.1");
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
5.string转const char*
string s;
char * ch;
ch = s.c_str();
6.TCP全流程(通信启动顺序)
(1).服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket
(2).服务器为socket绑定ip地址和端口号
(3).服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开
(4).客户端创建socket
(5).客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket
(6).服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求,客户端连接成功,向服务器发送连接状态信息,服务器accept方法返回,连接成功
(7).客户端向socket写入信息
(8).服务器读取信息
(9).客户端关闭
(10).服务器端关闭
>>>>>代码实现过程详解:
(1S)WSAStartup(MAKEWORD(2, 2), &wsaData)
(2S)服务端_SocketS = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
(3S)服务端bind(_SocketS,(struct sockaddr *)&_Addr【服务端地址】, sizeof(_Addr))
(1C)客户端 _mSocketC = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
(4S)服务端_SocketC = accept(_SocketS,(struct sockaddr *)&_ClientAddr1【获得客户端地址】, &_AdrLen)【用作处理多客户端并发时可循环】
(2C)客户端 connect(_mSocketC,(struct sockaddr *)&_Addr【服务端地址】, sizeof(_Addr))
(3C)客户端 send(_mSocketC,(char*)&_mControlToPrisse,sizeof(_mControlToPrisse),0) 【循环】
(5S)服务端 recv(_SocketC ,(char*)&_mControlToPrisse,sizeof(_mControlToPrisse),0) 【循环】
7.UDP通信流程
(1S)WSAStartup(MAKEWORD(2, 2), &wsaData)
(1C)客户端 _mSocketC = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
(2C)客户端 sendto(_mSocketC,(char*)&_mControlToPrisse,sizeof(_mControlToPrisse),0,(sockaddr*)&_Addr【服务端地址】, sizeof(_Addr)) 【循环】
(2S)服务端_SocketS = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
(3S)服务端bind(_SocketS,(struct sockaddr *)&_Addr【服务端地址】, sizeof(_Addr))
(4S)服务端 recvfrom(_SocketC ,(char*)&_mControlToPrisse,sizeof(_mControlToPrisse),0,(sockaddr*)&_Addr【服务端地址】, sizeof(_Addr)) 【循环】
8.线程函数
#include <Windows.h>
DWORD WINAPI _threadR(LPVOID lpParameter){ ……}
//start thread
DWORD thread_hnd;
HANDLE ThreadR = CreateThread(NULL,0,_threadR,NULL,0,&thread_hnd);
//close thread
CloseHandle(ThreadR);