Windows下的socket编程
代码参考:
https://blog.csdn.net/lindamtd/article/details/79832835
https://blog.csdn.net/ckzhb/article/details/81632562
服务器端:
功能:
1、 监控端口,等待客户端的请求;(此socket用于监听)
2、 建立连接成功后,用于数据传输;(次socket用于传输数据)
1.加载套接字,创建套接字(WSAStartup()/socket)
(ps: WSAStartup,即WSA(Windows Sockets Asynchronous,Windows异步套接字)的启动命令)
2.绑定套接字到一个IP地址和端口(bind())
3.将套接字设置为监听模式等待请求连接(listen())
4. 请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字
5. (accept());
6. 用返回的套接字和Client进行通信(send()/recv())
7. 返回,等待另一连接请求
9. 关闭套接字,关闭加载的套接字库(closesocket()/WSAClean())
客户端
1、加载套接字库,创建套接字(WSAStartup()/socket());
2、向服务器发出连接请求(connect());
3、和服务器端进行通信(send()/recv());
4、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
MFC机制下利用CSocket
服务器端
int main()
{
AfxSocketInit(); //初始化
CSocket listenSocket, serverSocket;
//创建套接字
if (!listenSocket.Socket())
{
char error[256] = {0};
sprintf(error, "Create Faild: %d", GetLastError());
AfxMessageBox(error);
return 1;
}
BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
listenSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET); //SO_REUSEADDR BOOL 允许套接口和一个已在使用中的地址捆绑
// Bind
if (!listenSocket.Bind(8888)) // 绑定端口号为8888 端口号0~65535 0~1024个为系统端口,1025~65535是为用户保留的端口
{
char error[256] = {0};
sprintf(error, "Bind Faild: %d", GetLastError());
AfxMessageBox(error);
return 1;
}
// listen
if(!listenSocket.Listen(10)) //10代表最大可连接数
{
char error[256] = {0};
sprintf(error, "Listen Faild: %d", GetLastError());
AfxMessageBox(error);
return 1;
}
// Accept
if(!listenSocket.Accept(serverSocket))
{
continue;
}
else
{
char recBuf[256] = {0};
serverSocket.Receive(recBuf, strlen(recBuf)); //接收客户端内容:阻塞
char sendBuf[256] = {"hello"};
serverSocket.Send(sendBuf,strlen(sendBuf));
}
serverSocket.Close();
listenSocket.Close();
}
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
sockfd:标识一个套接口的描述字。
level:选项定义的层次;支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。
optname:需设置的选项。
optval:指针,指向存放选项待设置的新值的缓冲区。
optlen:optval缓冲区长度。
客户端
AfxSocketInit(); //初始化
CSocket sendSocket;
sendSocket.Create(); //创建套接字
socket.Connect(HOST_IP, HOST_PORT); // 连接
//连接建立,传输数据
char recBuf[256] = {0};
sendSocket.Receive(recBuf, strlen(recBuf)); //接收客户端内容:阻塞
char sendBuf[256] = {"hello"};
sendSocket.Send(sendBuf,strlen(sendBuf));
sendSocket.Close();