linux 网络编程TCP服务器端

本文介绍了一个简单的TCP服务器的实现过程,包括创建socket、绑定地址、监听连接、接收客户端请求并响应等功能。通过代码示例,展示了如何使用C语言进行网络编程,适合初学者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近开始学习网络编程,记录一下网络上老师视频上的代码

#include<netdb.h>
#include<sys/socket.h>
#include<unistd.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<signal.h>
#include<time.h>

int sockfd;

void sig_handler(int signo)//发送结束信号,停止总socket
{
		if(signo == SIGINT )
		{
			printf("server close\n");
			//6
			close(sockfd);
			exit(1);
		}
}

void out_addr(struct sockaddr_in * clientaddr)//打印连接的客户端信息
{
	char ip[16];
	memset(ip, 0,sizeof(ip));
	int port = ntohs(clientaddr->sin_port);
	//inet_ntop(AF_INET, &clientaddr->sin_addr.s_addr, ip, sizeof(ip));
	printf("client: %s(%d) connected\n", ip, port);
	
}

void do_service(int fd)//与客户端进行数据传输
{
	long t = time(0);
	char *s = ctime(&t);
	size_t size = strlen(s)*sizeof(char);
	if(write(fd, s, size) != size)//发送当前的时间到客户端
	{
		perror("write error");
	}
}
		
int main(int argc, char *argv[])
{

	if(argc < 2)
	{
		printf("usage: %s #port\n", argv[0]);
		exit(1);
	}
	
	if(signal(SIGINT, sig_handler)  ==  SIG_ERR)
	{
		printf("signal sigint error\n");
		exit(1);
	}


//1.创建socket
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	
//2.绑定socket,调用bind函数将socket和地址(包括ip,port)进行绑定
	struct sockaddr_in serveraddr;
	memset(&serveraddr, 0, sizeof(serveraddr));
	//王地址中填入ip,port,Internet地址族类型
	serveraddr.sin_family = AF_INET;//ipv4
	serveraddr.sin_port = htons(atoi(argv[1]));//port端口
	serveraddr.sin_addr.s_addr = INADDR_ANY;
	
	if(bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
	{
		perror("bind error\n");
		exit(1);
	}

	/*3. 调用listen函数启动监听,将接受到的客户端连接放到队列中
	*第二个参数是队列的长度
	*/
	if(listen(sockfd, 10) < 0)
	{
		perror("listen error\n");
		exit(1);
	}

	/*4.调用accept函数从队列中获取一个客户端请求,并返回新的socket描述符,
	*若没有客户端连接,则一直阻塞等待,直到有链接
	*/
	struct sockaddr_in clientaddr;
	socklen_t clientaddr_len = sizeof(clientaddr);	
	while(1)
	{
		int fd = accept(sockfd, (struct sockaddr*)&clientaddr, &clientaddr_len);
		if(fd < 0)
		{
			perror("accept error\n");
			continue;
		}
		
		//5.调用io函数与连接的客户端进行双向通信
		out_addr(&clientaddr);
		do_service(fd);
		close(fd);//6.当前通信完成,关闭当前的socket
	}

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值