《Windows网络编程案例教程》-董相志 学习记录 阻塞/非阻塞套接字编程
2.3 阻塞/非阻塞套接字编程
阻塞套接字编程通信流程图
2.3.1 阻塞套接字客户机编程
1.启动并初始化Winsock2服务
WSADATA WsaDat;
WSAStartup(MAKEWORD(2,2),&WsaDat);
2.创建Socket
SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
3.解析服务器主机名、配置服务器地址、端口信息
struct hostent *host;
host=gethostbyname("localhost");
SOCKADDR_IN SockAddr;
SockAddr.sin_port=htons(8888);
SockAddr.sin_family=AF_INET;
SockAddr.sin_addr.s_addr=*((unsigned long*)host->h_addr);
- 连接服务器
connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr));
5.接收数据并显示
char buffer[1024];
int nDataLength=recv(Socket,buffer,1024,0);
std::cout<<buffer;
6.断开套接字连接
shutdown(socket,SD_SEND);
7.关闭套接字
closesocket(socket);
8.关闭Winsock套接字服务,释放资源
WSACleanup();
程序2.4 阻塞式套接字客户机完整代码
//程序2.4 阻塞式套接字客户机完整代码
#include <iostream>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
// 初始化 Winsock服务
WSADATA WsaDat;
if(WSAStartup(MAKEWORD(2,2),&WsaDat)!=0)
{
std::cout<<"Winsock错误 - Winsock服务初始化失败!\r\n";
WSACleanup();
system("PAUSE");
return 0;
}
// 创建套接字
SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(Socket==INVALID_SOCKET)
{
std::cout<<"套接字错误 -创建套接字失败!\r\n";
WSACleanup();
system("PAUSE");
return 0;
}
// 主机名解析
struct hostent *host;
if((host=gethostbyname("localhost"))==NULL)
{
std::cout<<"主机名解析失败!\r\n";
WSACleanup();
system("PAUSE");
return 0;
}
// 初始化套接字地址结构信息
SOCKADDR_IN SockAddr;
SockAddr.sin_port=htons(8888);
SockAddr.sin_family=AF_INET;
SockAddr.sin_addr.s_addr=*((unsigned long*)host->h_addr);
// 连接服务器
if(connect(Socket,