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");

}

 

参考网站来源:https://blog.csdn.net/ch_jinyi/article/details/7439742

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值