【C++】Socket通信例子

创建两个工程文件,Server和Client

服务器模板代码

#include <WinSock2.h>
#include<iostream>
#pragma comment(lib,"ws2_32.lib")   //静态加入一个lib文件
#pragma warning(disable : 4996)
using namespace std;

int main() {
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA wsaData;
	if (WSAStartup(sockVersion, &wsaData) != 0) //WSAStartup返回0表示设置初始化成功
		return 0;

	/*创建套接字*/
	//AF_INET表示IPv4,SOCK_STREAM数据传输方式,IPPROTO_TCP传输协议;
	SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (listenSocket == INVALID_SOCKET) {
		cout << "套接字创建失败" << endl;
		WSACleanup();
		return 0;
	}

	/*绑定IP和端口*/
	//配置监听地址和端口
	sockaddr_in addrListen;
	addrListen.sin_family = AF_INET;     //指定IP格式
	addrListen.sin_port = htons(8888);   //绑定端口号
	addrListen.sin_addr.S_un.S_addr = INADDR_ANY;  //表示任何IP   service.sin_addr.s_addr = inet_addr("127.0.0.1");
	if (bind(listenSocket, (SOCKADDR*)&addrListen, sizeof(addrListen)) == SOCKET_ERROR) {
		cout << "绑定失败" << endl;
		closesocket(listenSocket);
		return 0;
	}

	/*开始监听*/
	if (listen(listenSocket, 5) == SOCKET_ERROR)
	{
		cout << "监听出错" << endl;
		closesocket(listenSocket);
		return 0;
	}

	/*等待连接,连接后建立一个新的套接字*/
	SOCKET revSocket;  //对应此时所建立连接的套接字的句柄
	sockaddr_in remoteAddr;   //接收连接到服务器上的地址信息
	int remoteAddrLen = sizeof(remoteAddr);
	cout << "等待连接..." << endl;
	/*等待客户端请求,服务器接收请求*/
	revSocket = accept(listenSocket, (SOCKADDR*)&remoteAddr, &remoteAddrLen);  //等待客户端接入,直到有客户端连接上来为止
	if (revSocket == INVALID_SOCKET) {
		cout << "客户端发出请求,服务器接收请求失败:" << WSAGetLastError() << endl;
		closesocket(listenSocket);
		WSACleanup();
		return 0;
	}
	else
		cout << "客服端与服务器建立连接成功:" << inet_ntoa(remoteAddr.sin_addr) << endl;

	char* sendData = new char[100];
	char revData[255] = "";

	while (1) {
		/*通过建立的连接进行通信*/
		int res = recv(revSocket, revData, 255, 0);
		if (res > 0)
			cout << "客户端: " << revData << "  字节数:" << res << endl;

		else if (res == 0)
			cout << "Connection closed" << endl;
		else
			cout << "recv failed: " << WSAGetLastError() << endl;

		cin >> sendData;
		if (strcmp(sendData, "q") == 0) {
			cout << "服务器停止发送数据!" << endl;
			break;
		}
		//发送数据
		send(revSocket, sendData, strlen(sendData), 0);
		cout << "服务器: " << sendData << endl;
	}
	closesocket(listenSocket);
	WSACleanup();
}

客户端模板代码

#include <WinSock2.h>
#include<iostream>
#pragma comment(lib,"ws2_32.lib")   //静态加入一个lib文件
#pragma warning(disable : 4996)
using namespace std;

int main() {
	WORD sockVerson = MAKEWORD(2, 2);
	WSADATA wsaData;
	if (WSAStartup(sockVerson, &wsaData) != 0)
		return 0;

	//建立客户端socket
	SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (clientSocket == INVALID_SOCKET)
	{
		printf("套接字创建失败");
		WSACleanup();
		return 0;
	}

	//定义要连接的服务器地址
	sockaddr_in addrConServer;
	addrConServer.sin_family = AF_INET;
	addrConServer.sin_port = htons(8888);
	addrConServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	if (connect(clientSocket, (SOCKADDR*)&addrConServer, sizeof(addrConServer)) == SOCKET_ERROR)
	{
		printf("客户端建立连接失败!\n");
		closesocket(clientSocket);
		WSACleanup();
		return 0;
	}
	else
		printf("客户端建立连接成功,准备发送数据!\n");

	//发送数据
	char sendBuf[255] = "";
	
	while (1) {
		cin >> sendBuf;
		int sendRes = send(clientSocket, sendBuf, (int)strlen(sendBuf), 0);
		if (sendRes == SOCKET_ERROR) {
			printf("客户端send()出现错误 : %d\n", WSAGetLastError());
			closesocket(clientSocket);
			WSACleanup();
			return 0;
		}
		else
			cout << "客户端: " << sendBuf << endl;
		//接收服务端数据
		/*通过建立的连接进行通信*/
		int res;
		char revSerData[100] = "";
		res = recv(clientSocket, revSerData, sizeof(revSerData), 0);
		if (res > 0) {
			printf("Bytes received: %d\n", res);
			printf("服务器发送的数据: %s\n", revSerData);
		}
		else if (res == 0)
			printf("Connection closed\n");
		else
			printf("recv failed: %d\n", WSAGetLastError());
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值