tcp_server.cpp 2.48 KB
#include <iostream>
using namespace std;

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#define SIZE 1024

void connectToClient(int &clientfd) {
	char recvBuf[SIZE]; // 接收缓冲区
	char sendBuf[SIZE]; // 发送缓冲区
	int recvRet, sendRet; // 接受反馈及发送反馈

	while (clientfd != -1) {
		// receive data
		recvRet = recv(clientfd, recvBuf, sizeof(recvBuf), 0);
		while(recvRet > 0) {
			recvBuf[recvRet] = '\0';
			if(strcmp(recvBuf, "$") == 0)
				break;
			cout << "recv data from client " << clientfd << ", data : " << recvBuf << endl;
			recvRet = recv(clientfd, recvBuf, sizeof(recvBuf), 0);
		}

		// // send data 
		// cout << clientfd << ">> ";
		// cin >> sendBuf;
		// while(sendBuf) {
		// 	sendRet = send(clientfd, sendBuf, sizeof(sendBuf), 0);
		// 	if (strcmp(sendBuf, "$") == 0)
		// 		break;
		// 	if (sendRet == -1)
		// 		cout <<"send data error." << endl;
		// 	else
		// 		cout << "Sent data to client: " << sendBuf << endl;
		// 	cout << clientfd << ">> ";
		// 	cin >> sendBuf;
		// }

		// // 是否关闭连接
		// recvRet = recv(clientfd, recvBuf, sizeof(recvBuf), 0);
		// if (recvRet == -1)
		// 	cout << "Error receiving data\n";
		// else if(strcmp(recvBuf, "y") == 0) {
		// 	cout << "Have closed connection " << clientfd << '.' << endl;
		// 	close(clientfd);
		// 	break;
		// }
	}
}

int main() {
	// create socket
	int serverfd = socket(AF_INET, SOCK_STREAM, 0); // IPV4 + TCP
	if(-1 == serverfd) {
		printf("create socket error");
		return -1;
	}
	
	// bind port 
	struct sockaddr_in bindaddr;
	bindaddr.sin_family = AF_INET;
	bindaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	bindaddr.sin_port = htons(30030);
	if(-1 == bind(serverfd, (struct sockaddr *)&bindaddr, sizeof(bindaddr))) {
		cout << "bind error" <<  endl;
		return -1;
	}
	
	// start listen
	if (listen(serverfd, 1024) == -1) {
		printf("listem error");
		return -1;
	}

	while (1) {
		struct sockaddr_in clientaddr;
		socklen_t clientaddrlen = sizeof(clientaddr);
		
		// accept connection
		int clientfd = accept(serverfd, (struct sockaddr *)&clientaddr, &clientaddrlen);
		if(clientfd!= -1) {
			// 获取客户端的信息
			char cliIp[16];
			inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, cliIp, sizeof(cliIp));
			unsigned short cliPort = ntohs(clientaddr.sin_port);
			cout << "client ip is : " << cliIp << ", port is : " << cliPort << endl;
			connectToClient(clientfd);
		}
	}
	
	//close socket
	close(serverfd);
	return 0;
}