基于TCP/IP的网络编程(C++语言编程)

基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序一般分为服务器端和用户端两部分。设计思路(visual studio下):

第一部分 服务器端
  一、创建服务器套接字(create)。
  二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。
  三、接受来自用户端的连接请求(accept)。
  四、开始数据传输(send/receive)。
  五、关闭套接字(closesocket)。

第二部分 客户端
  一、创建客户套接字(create)。
  二、与远程服务器进行连接(connect),如被接受则创建接收进程。
  三、开始数据传输(send/receive)。
  四、关闭套接字(closesocket)。

service:

#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h>  //WindowsSocket编程头文件
#include<iostream>
#include<cstring>
#pragma comment(lib,"ws2_32.lib")//链接ws2_32.lib库文件到此项目中
using namespace std;

//================全局常量==================
         //创建缓冲区
const int BUF_SIZE = 2048;
//================全局变量==================
SOCKET sockSer, sockCli;
SOCKADDR_IN addrSer, addrCli; //address
int naddr = sizeof(SOCKADDR_IN);

char sendbuf[BUF_SIZE];
char inputbuf[BUF_SIZE];
char recvbuf[BUF_SIZE];
//================函数声明==================
int main() {
	cout << "服务器启动" << endl;
	//加载socket库
	WSADATA wsadata;
	if (WSAStartup(MAKEWORD(2, 2),&wsadata) != 0)
	{
		//输出出错信息
		cout << "载入socket库失败!" << endl;
		system("pause");
		return 0;
	}
	else {
		cout << "载入socket库成功!" << endl;
	}
	//创建Soucket;
	sockSer = socket(AF_INET, SOCK_STREAM, 0);
	//描述协议族,INET属于ipv4;
	//sock_stream创建套接字类型:tcp;
	//0不指定协议,常用的协议有tcp、udp等

	//初始化地址包
	addrSer.sin_addr.s_addr = inet_addr("192.168.138.1");
	addrSer.sin_family = AF_INET;
	addrSer.sin_port = htons(1111);

	//绑定Socket(bind)
	bind(sockSer, (SOCKADDR*)&addrSer, sizeof(SOCKADDR));
	//强制将SOCKADDR_INET转化成SOCKEADDR

	//监听
	while (true) {
		cout << "开始连接!" << endl;
		//监听连接请求;
		listen(sockSer,5);
		//等待连接最大数:5

		//接受连接
		sockCli=accept(sockSer, (SOCKADDR*)&addrCli, &naddr);
		if (sockCli != INVALID_SOCKET) {
			while (true)
			{
				cout << "连接成功" << endl;
				cout << "请输入要发送给客户端的信息:" << endl;
				cin >> sendbuf;
				send(sockCli, sendbuf, sizeof(sendbuf), 0);
				//strcpy(sendbuf, "hello");
				//send(sockCli, sendbuf, sizeof(sendbuf), 0);

				//接收客户端发来信息
				recv(sockCli, recvbuf, sizeof(recvbuf), 0);
				cout << "客户端发来的信息:" << recvbuf << endl;
			}
			
		}
		else
		{
			cout << "连接失败!" << endl;
		}
	}
	closesocket(sockSer);
	closesocket(sockCli);
	return 0;

}

client:

#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h>  //WindowsSocket编程头文件
#include<iostream>
#include<cstring>
#pragma comment(lib,"ws2_32.lib")//链接ws2_32.lib库文件到此项目中
using namespace std;

//================全局常量==================
//创建缓冲区
const int BUF_SIZE = 2048;
//================全局变量==================
SOCKET sockSer, sockCli;
SOCKADDR_IN addrSer, addrCli; //address
int naddr = sizeof(SOCKADDR_IN);

char sendbuf[BUF_SIZE];
char inputbuf[BUF_SIZE];
char recvbuf[BUF_SIZE];
//================函数声明==================
int main() {
	//加载socket库
	cout << "客户端启动" << endl;
	WSADATA wsadata;
	if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
	{
		//输出出错信息
		cout << "载入socket库" << endl;
		system("pause");
		return 0;
	}
	//创建Soucket;
	sockCli = socket(AF_INET, SOCK_STREAM, 0);
	//描述协议族,INET属于ipv4;
	//sock_stream创建套接字类型:tcp;
	//0不指定协议,常用的协议有tcp、udp等

	//初始化客户端地址包
	addrCli.sin_addr.s_addr = inet_addr("127.0.0.1");
	addrCli.sin_family = AF_INET;
	addrCli.sin_port = htons(1111);

	//初始化服务器地址
	addrSer.sin_addr.s_addr = inet_addr("192.168.138.1");
	addrSer.sin_family = AF_INET;
	addrSer.sin_port = htons(1111);

	while (true)
	{
		if (connect(sockCli, (SOCKADDR*)&addrSer, sizeof(addrSer))!=SOCKET_ERROR)
		{
			while (true)
			{
				//接收服务器信息
				cout << "客户端连接成功" << endl;
				recv(sockCli, recvbuf, sizeof(recvbuf), 0);
				cout << "服务端发的信息:" << recvbuf << endl;
				//发送给服务器信息
				cout << "请输入要发送给服务器的信息:" << endl;
				cin >> sendbuf;

				send(sockCli, sendbuf, sizeof(sendbuf), 0);
				cout << "发送成功" << endl;
			}
			
		}
		else
		{
			//cout << "客户端连接失败" << endl;
		}
	}
	closesocket(sockSer);
	closesocket(sockCli);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37909508/article/details/84140534