WinSocket实现简单服务器和客户端

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

简单的winsock实现的服务器

提示:以下是本篇文章正文内容,下面案例可供参考

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的使用区别

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值