⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpfactory.cpp

📁 c++编写的FTP服务器和客户端程序
💻 CPP
字号:
#include <netdb.h>
#include <arpa/inet.h>
#include "tcpfactory.h"

using namespace std;

TcpFactory::TcpFactory() {
	listenSock = -1;
}

TcpFactory::~TcpFactory() {
	if(listenSock!=-1)
		if(close(listenSock)) throw "Close socket failed";
}

void TcpFactory::setDest(int addr, int port) {
	destAddr = htonl(addr);
	destPort = htons(port);
}

void TcpFactory::setDest(const string& addr, int port) {
	hostent* hp = gethostbyname(addr.c_str());
	if(!hp) throw "Resolve address failed";

	destAddr = *(uint32_t*)hp->h_addr_list[0];
	destPort = htons(port);
}

Tcp* TcpFactory::connect() {
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd==-1) throw "Create socket failed";

	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = destAddr;
	addr.sin_port = destPort;

	if(::connect(sockfd, (sockaddr*)&addr, sizeof addr))
		throw "Establish connection failed";

	cout << "\t[M] Connected to " << inet_ntoa(addr.sin_addr) << ":" << ntohs(destPort) << endl;
	return new Tcp(sockfd);
}

void TcpFactory::setLocalPort(int port) {
	int newPort = htons(port);

	if(localPort!=newPort) {
		localPort = newPort;

		if(listenSock!=-1) {
			if(close(listenSock)) throw "Close socket failed";
			listenSock = -1;
		}
	}
}

Tcp* TcpFactory::listen() {
	cout << "\t[M] Listening on local port " << ntohs(localPort) << endl;

	if(listenSock==-1) {
		listenSock = socket(AF_INET, SOCK_STREAM, 0);
		if(listenSock==-1) throw "Create socket failed";

		sockaddr_in addr;
		addr.sin_family = AF_INET;
		addr.sin_addr.s_addr = INADDR_ANY;
		addr.sin_port = localPort;

		if(bind(listenSock, (sockaddr*)&addr, sizeof addr))
			throw "Bind listen port failed";

		if(::listen(listenSock, MAX_CONNECTION))
			throw "Listen connection failed";
	}

	sockaddr_in addr;
	socklen_t len = sizeof addr;
	int sockfd = accept(listenSock, (sockaddr*)&addr, &len);
	if(sockfd==-1) throw "Accept connection failed";

	cout << "\t[M] Accept connection from " << inet_ntoa(addr.sin_addr) << ":" << ntohs(addr.sin_port) << endl;

	return new Tcp(sockfd);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -