在Windows下使用Socket API简单实现C/S通讯

  最近一直在看Linux下网络编程,想着先在window下编写基于C/S模式的socket网络编程,想看socket API函数详细讲解的可以先看下面第一个参考文章。为了防止自己忘记,写下这边博客。

  具体不多说 ,直接上代码,,,功能比较简单,,以后继续更新!

 

服务器端程序:

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <string>
#include <WinSock2.h>

#pragma comment(lib,"ws2_32.lib")  //显示加载ws2_32.dll

using namespace std;

int main() {
	std::cout << "-----服务器端-----" << std::endl;
	//1.初始化WSA 因为WSAStartup函数完成对winsock服务的初始化
	int Ret;
	WSADATA wsadata;
	if ((Ret = WSAStartup(MAKEWORD(2, 2), &wsadata)) != 0) {
		printf("WSAStartup() failed with error %d\n", Ret);
		WSACleanup();
	}
	//2.创建服务器的套接字
	SOCKET sSocket;
	sSocket = socket(AF_INET, SOCK_STREAM, 0);  //socket协议簇,使用IPv4,流式套接字
	if (SOCKET_ERROR == sSocket) {
		std::cout << "服务器端套接字创建失败!" << std::endl;
	}
	else {
		std::cout << "服务器端套接字创建成功!" << std::endl;
	}
	//3.绑定套接字 指定绑定的IP地址和端口号
	sockaddr_in socketAddr;  //创建地址结构体对象
	socketAddr.sin_family = AF_INET;
	socketAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	socketAddr.sin_port = htons(1234);
	//4.服务器监听
	if ((bind(sSocket, (SOCKADDR*)&socketAddr, sizeof(socketAddr)) == SOCKET_ERROR)) {
		std::cout<<"绑定失败!"<<std::endl;
	}
	else {
		std::cout<<"绑定成功!"<<std::endl;
	}
	//4.服务器监听
	int slisten = listen(sSocket, 5);  //最多监听5个请求
	if (slisten == SOCKET_ERROR) {
		std::cout << "监听失败!" << std::endl;
	}
	else {
		std::cout << "监听成功!" << std::endl;
	}
	//5.接受请求
	sockaddr_in remoteAddr;
	SOCKET sClientSocket;
	int _revSize = sizeof(remoteAddr);
	sClientSocket = accept(sSocket, (SOCKADDR*)&remoteAddr, &_revSize);
	if (sClientSocket == INVALID_SOCKET) {
		std::cout << "服务端接收请求失败!" << std::endl;
	}
	else {
		std::cout << "服务端接收请求成功!" << std::endl;
	}
	while (true) {
		
		char recvBuf[2048] = {};
		int reLen = recv(sClientSocket, recvBuf, 2048, 0);
		cout << reLen << endl;
		int sLen = send(sClientSocket, recvBuf, reLen, 0);
		if (SOCKET_ERROR != reLen) {
			cout << "服务器已经接收到数据!" << recvBuf<<endl;
			reLen = SOCKET_ERROR;
		}
	}
	6.发送/接收数据
	//char recvBuf[1024] = {};
	//int reLen = recv(sClientSocket, recvBuf, 1024, 0);
	//int sLen = send(sClientSocket, recvBuf, reLen, 0);
	//if (SOCKET_ERROR == reLen) {
	//	std::cout << "服务端发送数据失败!" << std::endl;
	//}
	//else {
	//	std::cout << "服务器接收数据:" << recvBuf << std::endl;
	//}
	//7. 关闭socket
	closesocket(sClientSocket);
	closesocket(sSocket);
	//8.终止
	WSACleanup();
	std::cout << "服务器终止!" << std::endl;
	system("pause");
	return 0;
}

客户端程序:

#define _WINSOCK_DEPRECATED_NO_WARNINGS 
#include <iostream>
#include <string>
#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")

using namespace std;

int main() {
	cout << "-----客户端-----" << endl;
	//1.初始化
	WSADATA wsadata;
	WSAStartup(MAKEWORD(2, 2), &wsadata);
	//2.创建套接字
	SOCKET cSocket = {};
	cSocket = socket(AF_INET, SOCK_STREAM, 0);
	if (cSocket == SOCKET_ERROR) {
		cout << "客户端套接字创建失败!" << endl;
	}
	else {
		cout << "客户端套接字创建成功!" << endl;
	}
	//3.绑定套接字
	sockaddr_in socketAddr;
	socketAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	socketAddr.sin_family = AF_INET;
	socketAddr.sin_port = htons(1234);
	int cRes = connect(cSocket, (SOCKADDR*)&socketAddr, sizeof(SOCKADDR));
	if (cRes == SOCKET_ERROR) {
		cout << "客户端连接服务器失败!" << endl;
	}
	else {
		cout << "客户端连接服务器成功!" << endl;
	}
	while (true) {
		string s;
		cout << "请输入要发送的数据:" << endl;
		getline(cin, s);
		int senderr = send(cSocket, (char*)s.c_str(), s.length(), 0);
		if (senderr == SOCKET_ERROR) {
			cout << "发送错误!" << endl;
			break;
		}
		char recvBuf[2048] = {};
		recv(cSocket, recvBuf, 2048, 0);
		cout << "客户端接受的数据:" << recvBuf << endl;
	}
	4.发送请求
	//char sendBuf[1024] = "from Client: hello server.";
	//send(cSocket, sendBuf, strlen(sendBuf), 0);
	5.接收数据
	//char recvBuf[1024] = {};
	//recv(cSocket, recvBuf, 1024, 0);
	//cout << "客户端接收数据:" << recvBuf << endl;
	//6.关闭socket
	closesocket(cSocket);
	//7.终止
	WSACleanup();
	cout << "客户端退出!" << endl;
	system("pause");
	return 0;
}

参考文献:

1、https://www.cnblogs.com/yskn/p/9346570.html

2、https://www.csdn.net/gather_28/MtzaAg4sMDctYmxvZwO0O0OO0O0O.html

3、https://wenku.baidu.com/view/413b541d5022aaea988f0f49.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值