转载

VS2015 C++ main()下进行SOCKET单线程网络通信简单例子(聊天软件的搭建)

//服务器
 
 
 
#include<iostream>
#include <Winsock2.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
int main()
{
	WSADATA wsaData;
	SOCKET sockSrv;
	SOCKADDR_IN addrSrv;
	SOCKADDR_IN addrClient;//用来接受客户端的地址信息
	int len = sizeof(SOCKADDR);
	int err;
	WORD wVersionRequested;//用来保存Winsock库的版本号
	
	wVersionRequested = MAKEWORD(2, 2);//创建一个包含了请求版本号的WORD值
	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0)
	{
		cout << "启动使用Winsock DLL失败" << endl;
		return 0;
	}
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		WSACleanup();
		cout << "启动使用Winsock DLL失败" << endl;
		return 0;
	}
	sockSrv = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建套接字
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);
	bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//将套接字绑定到本地址和指定端口号上
 
	
	listen(sockSrv, 5);
	SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
//多线程从这里开启
//while循环实际是添加到这里,程序运行到这里会进行中断。跳出中断时,表示有客户端连接。进行多
//线程编程则可以从这里开启线程(本实例为了达到单线程通信(服务器<->客服端),将消息循环接收放在下
//面的循环里了),例如聊天软件,可以从这里开启多线程消息处理后将消息转发到sockConn对应的客户端,
//就形成了两个客户端间的通信
//addrClient包含了连接的客户端的IP地址
 
	cout << "欢迎你加入" << endl;
	send(sockConn, "欢迎你加入", 20, 0);//用返回的套接字和客户端进行通信。
	while (true)
	{
 
		char sendBuf[256];
		char recvBuf[256];
		recv(sockConn, recvBuf, strlen(recvBuf),0);
		Sleep(1000);
		if (strlen(recvBuf) > 0)
		{
			cout << recvBuf << endl;
			cout << "Input:";
			cin >> sendBuf;
			send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);//用返回的套接字和客户端进行通信。
		}
	}
	closesocket(sockConn);
	system("pause");
	return 0;
}

 

//客户端
 
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<iostream>
#include <Winsock2.h>
#include<stdlib.h>
using namespace std;
 
#pragma comment(lib, "ws2_32.lib")
int main()
{
	WORD wVersinRequested;
	WSADATA wsaData;
	int err;
	wVersinRequested = MAKEWORD(2, 2);
	err = WSAStartup(wVersinRequested, &wsaData);
	if (err != 0)
	{
		cout << "启动使用Winsock DLL失败" << endl;
		return 0;
	}
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		WSACleanup();
		cout << "启动使用Winsock DLL失败" << endl;
		return 0;
	}
	SOCKADDR_IN addrSrv;//设定服务器端的IP和端口
 
	addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//本地回路地址
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);
	SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);//将其第三个参数设为0,让其自动选择协议。
	connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//与服务器建立连接。
	Sleep(2000);
	while (1)
	{
		char recvBuf[100];
		char sendBuf[100];
		recv(sockClient, recvBuf, 100, 0);
		Sleep(1000);
		if (strlen(recvBuf) > 0)
		{
			cout << recvBuf << endl;
			cout << "Input:";
			cin >> sendBuf;
			send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
		}
		
	}
	closesocket(sockClient);
 
	WSACleanup();
	system("pause");
 
}

 

文章最后发布于: 2019-03-09 15:20:43
展开阅读全文
0 个人打赏

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览