网络编程-TCP服务器搭建

主函数:

#include <stdio.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 
#include <unistd.h>

#define ERR_MSG(msg) do{\ 
	fprintf(stderr, "__%d__:", __LINE__);\ 
	perror(msg);\ 
}while(0) 

#define PORT 8888 //1024~49151 
#define IP "10.0.12.9" //本机IP,ifconfig查找 

int main(int argc, const char *argv[]) 
{ 
	//创建流式套接字 
	int sfd = socket(AF_INET, SOCK_STREAM, 0); 
	if(sfd < 0) 
	{ 
		ERR_MSG("socket"); 
		return -1; 
	}

	//允许端口快速重用 
	int reuse = 1; 
	if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) 
	{ 
		ERR_MSG("setsockopt"); 
		return -1; 
	}
	printf("允许端口快速重用\n"); 

	//填充地址信息结构体 
	struct sockaddr_in sin; 
	sin.sin_family = AF_INET; //必须填AF_INET 
	sin.sin_port = htons(PORT); //网络字节序的端口号1024~49151 
	sin.sin_addr.s_addr = inet_addr(IP); //本机IP,ifconfig查找 

	//将IP和端口绑定到套接字上 
	if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0) 
	{ 
		ERR_MSG("bind"); 
		return -1; 
	}

	//将套接字设置为被动监听状态; 
	if(listen(sfd, 10) < 0) 
	{ 
		ERR_MSG("listen"); 
		return -1; 
	}
	printf("监听成功\n");

	struct sockaddr_in cin; 
	socklen_t addrlen = sizeof(cin); 

	//取出新的文件描述符 
	int newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen); 
	if(newfd < 0) 
	{ 
		ERR_MSG("accept"); 
		return -1; 
	}
	printf("[%s:%d] newfd=%d 连接成功\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd); 
	
	char buf[128] = ""; 
	ssize_t res = 0; 
	while(1) 
	{ 
		bzero(buf, sizeof(buf)); 

		//newfd中读取数据 
		res = recv(newfd, buf, sizeof(buf), 0); 
		if(res < 0) 
		{ 
			ERR_MSG("recv"); 
			return -1; 
		}
		else if(0 == res) 
		{ 
			fprintf(stderr, "newfd = %d 客户端关闭\n", newfd); 
			break; 
		}
		printf("newfd=%d : %s\n", newfd, buf); 
		strcat(buf, "*-*"); 

		//发送数据到客户端 
		if(send(newfd, buf, sizeof(buf), 0) < 0) 
		{ 
			ERR_MSG("send"); 
			return -1; 
		}printf("发送到newfd = %d客户端成功\n", newfd); 
	}

	//关闭文件描述符 
	close(sfd); 
	close(newfd); 
	return 0; 
}

测试:

允许端口快速重用
监听成功
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++中搭建TCP服务器可以通过使用网络编程库来实现。以下是一个简单的TCP服务器搭建的步骤: 1. 包含必要的头文件: ```cpp #include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> ``` 2. 创建套接字: ```cpp int serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == -1) { std::cout << "Failed to create socket." << std::endl; return -1; } ``` 3. 绑定IP地址和端口: ```cpp struct sockaddr_in serverAddress; serverAddress.sin_family = AF_INET; serverAddress.sin_port = htons(port); // 设置端口号 serverAddress.sin_addr.s_addr = INADDR_ANY; // 监听所有网络接口 if (bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == -1) { std::cout << "Failed to bind." << std::endl; close(serverSocket); return -1; } ``` 4. 监听连接请求: ```cpp if (listen(serverSocket, backlog) == -1) { std::cout << "Failed to listen." << std::endl; close(serverSocket); return -1; } ``` 5. 接受客户端连接: ```cpp struct sockaddr_in clientAddress; socklen_t clientAddressLength = sizeof(clientAddress); int clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddress, &clientAddressLength); if (clientSocket == -1) { std::cout << "Failed to accept client connection." << std::endl; close(serverSocket); return -1; } ``` 6. 与客户端进行通信: ```cpp char buffer[1024]; int bytesRead = recv(clientSocket, buffer, sizeof(buffer), 0); if (bytesRead == -1) { std::cout << "Failed to receive data from client." << std::endl; close(clientSocket); close(serverSocket); return -1; } // 处理接收到的数据 const char* response = "Hello from server!"; int bytesSent = send(clientSocket, response, strlen(response), 0); if (bytesSent == -1) { std::cout << "Failed to send response to client." << std::endl; } ``` 7. 关闭套接字: ```cpp close(clientSocket); close(serverSocket); ``` 这是一个简单的TCP服务器搭建的示例,你可以根据自己的需求进行扩展和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding Peasant

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值