socket客户端
//MFC例子,客户端
//需要包含Winsock2.h头文件,并连接Ws2_32.lib库文件。
//【项目】-【属性】-【链接器】-【输入】-【附加依赖项】,进行编辑,添加 ws2_32.lib库。去掉从父级或项目默认设置继承的勾选
#include <iostream>
#include "Winsock2.h"
int main()
{
//①**************************************************************//
// ①、首先加载套接字库
//加载套接字库,进行套接字库版本协商。第一个参数,指定请求的版本号。
//wVersionRequested高位字节,指定所需的Winsock库副板本,低位字节是主版本。
//可用MAKEWORD(x,y)宏,获得wVersionRequested的正确值,x是高位,y是低位。
//第二个参数是,指向WSADATA结构的指针,加载库的版本有关信息填在此处。
//WSADATA结构的,第一个字段wVersion:大算使用的winsock库版本。高位winsock的副板本,低位主版本。
//第二个字段wHighVersion:现有winsock库的最高版本。高位winsock的副板本,低位主版本。
//szDescription:事实上并没有用。
//szSystemStatus:事实上并没有用。
//iMaxSockets:不要使用。同时打开多少套接字。然而,应用WSAEnumProtocols来查询,很大程度与内存有关。
//iMaxUdpDg:不要使用。数据报的最大长度。
//lpVendorInfo:任何win32平台都没使用这个字段。
//WSAStartup()成功调用后,最后要WSACleanUp()。msdn有调用的例子。
WORD wVersionRequested;
WSADATA wsaData;
int err;
//调用1.1版本的
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return 0;
}
//看返回值低字节是否等于1,高字节是否等于1。
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
//如果不是请求的1.1版本,就清理返回。
WSACleanup();
return 0;
}
//②**************************************************************//
//②、接下来,创建套接字。
//SOCKET第一个参数,af:指定的地址簇,对于TCP/IP协议是AF_INET(也可写成PF_INET)
//第二个参数type:指定套接字类型。对于1.1版本,只有两个SOCK_STREAM流式套接字TCP,SOCK_DGREAM数据报UDP。
//第三个参数,与特定地址簇相关,设置0自动选择。
//如果调用成功,返回新的SOCKET数据类型的套接字描述符,如果失败返回INVALID_SOCKET,错误信息可通过WSAGetLastError函数
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
//③**************************************************************//
//③、客户端,不需要绑定,直接去连接。
//connect()第一个参数:套接字
//第二个参数:地址结构体指针,设置所要连接的服务器端的信息。
//第三个参数:地址结构体的长度。
SOCKADDR_IN addrSrv;//定义一个地址结构体
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//设置服务器端的IP地址,本机测试故127。
addrSrv.sin_family = AF_INET;
addrSrv.sin_port =htons(6000) ;//服务器端的端口,需要网络字节序。
//然后可以调用connect进行连接了。
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//④**************************************************************//
//④、接收服务器端发送的数据
char recvBuf[100];
recv(sockClient,recvBuf,100,0);//直接设100,没有+1。
printf("%s\r\n",recvBuf);
//⑤**************************************************************//
//⑤、向服务器发送数据
send(sockClient,"This is client",sizeof("This is client")+1,0);//多发一个字节,\0作用。
//⑥**************************************************************//
//⑥、关闭套接字,并终止套接字库的使用。
closesocket(sockClient);
WSACleanup();
system("PAUSE");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现