提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:以下是本篇文章正文内容,下面案例可供参考
1.服务端
代码如下(示例):
#include<iostream>
using namespace std;
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#define PORT 65432
//服务器端
int main()
{
WSADATA wsadata;
WORD w=MAKEWORD(2,2);
if(WSAStartup(w,&wsadata)!=0)
{
cout<<"加载动态链接库失败"<<endl;
WSACleanup();
return 0;
}
cout<<"加载WSA成功..."<<endl;
//1.创建套接字
SOCKET socket_server;
if((socket_server=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR)//0表示使用默认协议
{
cout<<"创建套接字成功"<<WSAGetLastError()<<endl;
WSACleanup();
return 0;
}
cout<<"创建监听的套接字成功..."<<endl;
//2.填写要绑定的本地地址
struct sockaddr_in addr;
int addr_len=sizeof(struct sockaddr_in);
memset((void *)&addr,0,addr_len);//将地址结构体清零
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
//3.绑定地址
if(bind(socket_server,(struct sockaddr*)&addr,sizeof(addr))!=0)
{
cout<<"地址绑定成功:"<<WSAGetLastError()<<endl;
closesocket(socket_server);
WSACleanup();
return 0;
}
cout<<"绑定成功"<<endl;
//4.将套接字设置为监听状态
if(listen(socket_server,0)!=0)//0表示等待队列为0
{
cout<<"list失败"<<WSAGetLastError()<<endl;
closesocket(socket_server);
WSACleanup();
return 0;
}
cout<<"listen..."<<endl;
//5.接受数据accept()
SOCKET newsocket;
struct sockaddr_in client_addr;
int size;
while(true)
{
if((newsocket=accept(socket_server,(struct sockaddr *)&client_addr,&addr_len))==INVALID_SOCKET)
{
cout<<"acept失败"<<WSAGetLastError()<<endl;
break;
}
else
cout<<"成功接受一个连接请求"<<endl;
cout<<"请输入连接回复给客户的消息"<<endl;
char a[20];
cin>>a;
size=send(newsocket,a,sizeof(a),0);
if(size!=0&size!=SOCKET_ERROR)
{
cout<<"信息发送成功"<<endl;
}
char msg[256];
size=recv(newsocket,msg,sizeof(msg),0);
if(size>0)
{
cout<<"收到的消息为:"<<msg<<endl;
}
closesocket(newsocket);
}
closesocket(socket_server);
WSACleanup();
return 0;
}
需要注意的点,在服务器端,监听和发送数据的是两个不同的SOCKET
2.客户端
代码如下(示例):
#include<iostream>
using namespace std;
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
//客户端程序
int main()
{
WSADATA wsadata;
WORD w=MAKEWORD(2,2);
if(WSAStartup(w,&wsadata)!=0)
{
cout<<"加载动态链接库失败"<<endl;
WSACleanup();
return 0;
}
//1.创建套接字socket()
SOCKET sock;
if((sock=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
{
cout<<"创建套接字失败"<<WSAGetLastError()<<endl;
WSACleanup();
return 0;
}
cout<<"输入IP"<<endl;
//2.连接服务器
char IP[20];
cin>>IP;
struct sockaddr_in sol;
memset((void *)&sol,0,sizeof(struct sockaddr_in));
sol.sin_family=AF_INET;
sol.sin_port=htons(65432);
sol.sin_addr.s_addr=inet_addr(IP);
if (connect(sock,(struct sockaddr*)&sol,sizeof(struct sockaddr_in))!=0)
{
}
char msg1[200];
int size=recv(sock,msg1,sizeof(msg1),0);
cout<<"收到的服务器信息"<<msg1<<endl;
char msg[200];
cout<<"输入发送的数据"<<endl;
cin>>msg;
send(sock,msg,sizeof(msg),0);
closesocket(sock);
WSACleanup();
return 0;
}
总结
注意服务端和客户端SOCKET的使用区别