一个简单的TCP通信程序(C/S)

以下是一个简单的tcp通信程序,基于C/S模式,使用c++编写,可在VS上运行(注意本程序为控制台程序,包含头文件)。

服务器端:

#include "pch.h"
#include<iostream>
#include"winsock2.h"
#include"WS2tcpip.h"
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main(int argc, char **argv) {
	WSADATA wsaData;
	SOCKET server_sock, newsock;//定义保存监听套接字和连接套接字的变量
	struct sockaddr_in addr;//绑定地址结构的变量
	struct sockaddr_in client_addr;//存放客户端地址的地址变量
	char rev[255];//接收缓冲区
	char sen[] = "connect success!";//发送给客户端的信息
	// * * * 加载动态链接库 * * * /
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
		cout << "加载winsock库失败!" << endl;
		return 0;
	}
	// * * * 创建套接字
	if ((server_sock = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR) {
		cout << "创建套接字失败!" << WSAGetLastError() << endl;
		WSACleanup();
		return 0;
	}
	// * * * 填写绑定的本地地址
	memset((void *)&addr, 0, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(60000);
	addr.sin_addr.s_addr = htonl(INADDR_ANY);
	// * * * 给监听套接字绑定地址
	if (bind(server_sock, (sockaddr *)&addr, sizeof(addr)) != 0)
	{
		cout << "绑定套接字失败!\n" << WSAGetLastError() << endl;
		closesocket(server_sock);
		WSACleanup();
		return 0;
	}
	// * * * 将套接字设为监听状态
	if (listen(server_sock, 0) != 0) {
		cout << "listen函数调用失败!" << WSAGetLastError() << endl;
		WSACleanup();
		return 0;
	}
	else
		cout << "正在监听....." << endl;
	// * * * 循环接收连接请求并发送数据
	int size;
	while (true) {
		int addr_len = sizeof(sockaddr_in);
		if ((newsock = accept(server_sock, (struct sockaddr*)&client_addr, &addr_len)) == INVALID_SOCKET) {
			cout << "接受客户端链接失败!" << WSAGetLastError() << endl;
			WSACleanup();
			return 0;
		}
		else
		{
			cout << "成功接受一个链接请求!" << endl;
		}
		size = send(newsock, sen, strlen(sen) + 1, 0);//给客户端发送信息
		if (size == SOCKET_ERROR) {
			cout << "发送数据失败!" << WSAGetLastError() << endl;
			WSACleanup();
			return 0;
		}
		if (size == 0) {
			cout << "连接已关闭!" << endl;
			WSACleanup();
			return 0;
		}
		else
		{
			cout << "信息发送成功!" << endl;
		}
		if ((size = recv(newsock, rev, sizeof(rev), 0)) < 0) {//接收来自客户端的信息
			cout << "接收信息失败!" << endl;
			WSACleanup();
			return 0;
		}
		if (size == 0) {
			cout << "连接已关闭!" << endl;
			WSACleanup();
			return 0;
		}
		else
			cout << "接收的信息:" << rev << endl;
		closesocket(newsock);
	}
	closesocket(server_sock);
	WSACleanup();
	return 0;

}

客户端:

#include "pch.h"
#include <iostream>
#include"WinSock2.h"
#include"WS2tcpip.h"
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main(int  argc, char **argv) {
	SOCKET sock_client;
	struct sockaddr_in addr;
	int addr_len = sizeof(struct sockaddr_in);
	char buffer[255];
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
		cout << "加载winsock库失败!" << endl;
		WSACleanup();
		return 0;
	}
	if ((sock_client = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR) {
		cout << "创建套接字失败!" <<WSAGetLastError()<<endl;
		WSACleanup();
		return 0;
	}
	char IP[20];
	cout << "请输入服务器IP地址:";
	cin >> IP;
	memset((void*)&addr, 0, addr_len);
	addr.sin_family = AF_INET;
	addr.sin_port = htons(60000);
	in_addr a;
	inet_pton(AF_INET, IP, &a);
	addr.sin_addr.s_addr = a.S_un.S_addr;

	// * * * 向服务端发送连接请求
	if (connect(sock_client, (struct sockaddr*)&addr, addr_len)!=0) {
		cout << "建立连接失败!" << WSAGetLastError() << endl;
		WSACleanup();
		return 0;
	}
	// * * * 接收来自服务器端的信息
	int size;
	if ((size = recv(sock_client, buffer, sizeof(buffer), 0)) < 0) {
		cout << "接收信息失败!" << WSAGetLastError() << endl;
		WSACleanup();
		return 0;
	}
	if (size == 0) {
		cout << "连接已关闭!" << endl;
		WSACleanup();
		return 0;
	}
	else
	{
		cout << "信息接收成功:" << buffer << endl;
	}

	// * * * 向服务器端发送信息
	cout << "发送给服务器信息:" << endl;
	cin >> buffer;
	if ((size = send(sock_client, buffer, strlen(buffer) + 1, 0))<0) {
		cout << "信息发送失败!" << WSAGetLastError() << endl;
		WSACleanup();
		return 0;
	}
	if (size == 0) {
		cout << "连接已关闭!" << endl;
		WSACleanup();
		return 0;
	}
	else
	{
		cout << "信息发送成功!";
	}

运行结果:

客户端:

服务器端:

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值