基于TCP&socket的CS通信(C++)

服务端

  1. socket() 创建套接字
  2. bind() 将套接字绑定在本机地址和端口
  3. listen() 监听,并等待客户端接入
  4. accept() 接受客户端请求
  5. recv()/send() 通信
  6. close() 关闭套接字

客户端

  1. socket() 创建套接字
  2. connect() 向服务器端发送连接请求
  3. recv()/send() 通信
  4. close() 关闭套接字

服务端:

#include<iostream>
using namespace std;
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include<windows.h>
#include<string>


int main(){
	//1.确定协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (HIBYTE(wsaData.wVersion) != 2 || LOBYTE(wsaData.wVersion) != 2){
		cout << "确定版本协议失败: " << GetLastError() << endl;
		return -1;
	}
	cout << "确定版本协议成功!" << endl;

	//2.创建socket
	SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (serverSocket == SOCKET_ERROR){
		cout << "创建socket失败: " << GetLastError() << endl;
		return -1;
	}
	cout << "创建socket成功!" << endl;


	//3.设置服务器地址簇
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET;
	addr.sin_addr.S_un.S_addr = inet_addr("10.181.73.111");
	addr.sin_port = htons(9527);

	//4.绑定
	int r = bind(serverSocket, (sockaddr*)&addr, sizeof(addr));
	if (r == -1){
		cout << "绑定失败: " << GetLastError() << endl;
		WSACleanup();
		return -1;
	}
	cout << "绑定成功!" << endl;

	//5.监听
	r = listen(serverSocket, 10);
	if (r == -1){
		cout << "监听失败: " << GetLastError() << endl;
		WSACleanup();
		return -1;
	}
	cout << "监听成功!" << endl;

	//6. 接受连接
	SOCKADDR_IN clientAddr = { 0 };
	int len = sizeof(clientAddr);
	SOCKET clientSocket = accept(serverSocket, (sockaddr*)&clientAddr, &len);
	if (clientSocket == SOCKET_ERROR){
		cout << "客户端连接失败:" << GetLastError() << endl;
		closesocket(serverSocket);
		WSACleanup();
		return -1;
	}
	cout << "客户端连接成功" << endl;

	// 7. 通信
	char buff[1024];
	while (1){
		r = recv(clientSocket, buff, 1023, NULL);
		if (r > 0){
			buff[r] = 0;
			cout << "来自客户端的消息:" << buff << endl;
		}
	}

}

客户端:

#include<iostream>
using namespace std;
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include<windows.h>
#include<string>


int main(){
	//1.确定协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (HIBYTE(wsaData.wVersion) != 2 || LOBYTE(wsaData.wVersion) != 2){
		cout << "确定版本协议失败: " << GetLastError() << endl;
		return -1;
	}
	cout << "确定版本协议成功!" << endl;

	//2.创建socket
	SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (clientSocket == SOCKET_ERROR){
		cout << "创建socket失败: " << GetLastError() << endl;
		return -1;
	}
	cout << "创建socket成功!" << endl;


	//3.设置服务器地址簇
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET;
	addr.sin_addr.S_un.S_addr = inet_addr("10.181.73.111");
	addr.sin_port = htons(9527);

	//4. 连接
	int r = connect(clientSocket, (sockaddr*)&addr, sizeof(addr));
	if (r == -1){
		cout << "服务器连接失败" << GetLastError() << endl;
		closesocket(clientSocket);
		WSACleanup();
		return -1;
	}
	cout << "服务器连接成功!" << endl;

	// 5. 通信
	char buff[1024];
	while (1){
		cout << "输入你发送的消息:";
		cin >> buff;
		send(clientSocket, buff, strlen(buff), NULL);
		}
	}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ 基于tcp协议的socket通信需要使用socket编程库,可以使用标准的BSD socket API 或者是跨平台的Boost.Asio库。 下面是一个使用BSD socket API实现的简单的客户端和服务器端代码示例: 服务器端代码: ```c++ #include <iostream> #include <cstring> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> using namespace std; int main() { // 创建socket int server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd == -1) { cout << "Failed to create socket!" << endl; return -1; } // 绑定地址和端口号 struct sockaddr_in address; memset(&address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(8888); if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) == -1) { cout << "Failed to bind socket!" << endl; return -1; } // 监听连接 if (listen(server_fd, 5) == -1) { cout << "Failed to listen socket!" << endl; return -1; } // 等待连接 int client_fd; struct sockaddr_in client_addr; socklen_t addr_len = sizeof(client_addr); if ((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len)) == -1) { cout << "Failed to accept connection!" << endl; return -1; } // 读取数据 char buffer[1024] = {0}; int read_len; if ((read_len = read(client_fd, buffer, 1024)) == -1) { cout << "Failed to read data!" << endl; return -1; } cout << "Received message: " << buffer << endl; // 发送数据 const char *response = "Hello World!"; if (write(client_fd, response, strlen(response)) == -1) { cout << "Failed to send data!" << endl; return -1; } // 关闭连接 close(client_fd); close(server_fd); return 0; } ``` 客户端代码: ```c++ #include <iostream> #include <cstring> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> using namespace std; int main() { // 创建socket int client_fd = socket(AF_INET, SOCK_STREAM, 0); if (client_fd == -1) { cout << "Failed to create socket!" << endl; return -1; } // 连接服务器 struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8888); if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) { cout << "Invalid address or address not supported!" << endl; return -1; } if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { cout << "Failed to connect server!" << endl; return -1; } // 发送数据 const char *message = "Hello Server!"; if (write(client_fd, message, strlen(message)) == -1) { cout << "Failed to send data!" << endl; return -1; } // 读取数据 char buffer[1024] = {0}; int read_len; if ((read_len = read(client_fd, buffer, 1024)) == -1) { cout << "Failed to read data!" << endl; return -1; } cout << "Received message: " << buffer << endl; // 关闭连接 close(client_fd); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值