目 录CONTENT

文章目录

【Socket】Socket服务端基本框架

千年的霜雪
2024-06-18 / 0 评论 / 0 点赞 / 14 阅读 / 0 字 / 正在检测是否收录...

Windows平台

暂无

Linux平台

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h> // 包含了inet.h

int main()
{
	// 创建监听套接字
	int fd = socket(AF_INET, SOCK_STREAM, 0);
	if (fd == -1)
	{
		perror("socket");
		return -1;
	}
	printf("socket\n");

	// 绑定本地IP端口 - 60001
	struct sockaddr_in saddr;
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(60001);
	saddr.sin_addr.s_addr = INADDR_ANY; // 该宏实际值为0 - 即0.0.0.0
										// 即该套接字可以绑定本地任意一个IP地址
										// 0没有大小端之分,因此不需要转换
	//inet_pton(AF_INET, "47.116.37.143", &saddr.sin_addr.s_addr);
	int ret = bind(fd, (struct sockaddr*)&saddr, sizeof saddr);
	if (ret == -1)
	{
		perror("bind");
		return -1;
	}
	printf("bind\n");
	
	// 设置监听
	ret = listen(fd, 128);
	if (ret == -1)
	{
		perror("listen");
		return -1;
	}
	printf("listen\n");

	// 阻塞并等待客户端连接
	struct sockaddr_in caddr;
	int addrlen = sizeof caddr;
	int cfd = accept(fd, (struct sockaddr*)&caddr, &addrlen);
	if (cfd == -1)
	{
		perror("accept");
		return -1;
	}
	printf("accept\n");

	// 若连接成功,打印客户端的IP与端口信息
	char ip[32];
	printf("客户端IP: %s, 端口: %d\n", inet_ntop(AF_INET, &caddr.sin_addr.s_addr, ip, sizeof ip), ntohs(caddr.sin_port));
	
	// 通信
	while (1)
	{
		printf("connect\n");
		//接收数据
		char buff[1024];
		int len = recv(cfd, buff, sizeof buff, 0);
		if (len > 0)
		{
			printf("client say: %s\n", buff);
			send(cfd, buff, len, 0);
		} // 接收到数据
		else if (len == 0)
		{
			break;
		} // 客户端断开连接
		else
		{
			perror("recv");
			break;
		} //调用失败
	}

	// 关闭文件描述符
	close(fd);
	close(cfd);

	return 0;
}
0

评论区