TCP/IP网络编程_计算器服务器端客户端

本文介绍了如何使用TCP/IP进行网络编程,通过示例展示了计算器服务器端和客户端的代码实现,涵盖了连接建立、数据传输及断开连接等关键步骤。

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

//服务器端代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

void error_handling(const char *msg)
{
	fputs(msg,stderr);
	exit(1);
}
int calc(int n,int *digs,char op)
{
	int res1=0;
	int res2=1;
	switch(op)
	{
		case '+':
			for(int i=0;i<n;++i)
				res1+=digs[i];
			return res1;
		case '*':
			for(int i=0;i<n;++i)
				res2*=digs[i];
			return res2;
	}
}
int main(int argc,char *argv[])
{
	int serv_sock,clnt_sock;
	struct sockaddr_in serv_adr,clnt_adr;
	socklen_t clnt_adr_sz;
	int opd,result,tmp,digs[25];
	char sym;
	if(argc!=2)
	{
		printf("Usage:%s <port>",argv[0]);
		exit(1);
	}
	serv_sock=socket(PF_INET,SOCK_STREAM,0);	//第一步
	if(serv_sock==-1)
		error_handling("socket() error\n");
		
	memset(&serv_adr,0,sizeof(serv_adr));
	serv_adr.sin_family=AF_INET;
	serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
	serv_adr.sin_port=htons(atoi(argv[1]));
	
	if(bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr))==-1)	//第二步
		error_handling("bind() error\n");
	if(listen(serv_sock,5)==-1)
		error_handling("listen() error\n");
		
	for(int i=0;i<5;++i)
	{
		clnt_adr_sz=sizeof(clnt_adr);
		clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_adr,&clnt_adr_sz);	//第三步
		if(clnt_sock==-1)
			error_handling("accept() error\n");
		printf("Connected %d......\n",i+1);
		read(clnt_sock,&opd,1);	//读取第一个字节,因为opd是int类型,会发生自动char->int转换
		for(int k=0;k<opd;++k)
		{
			read(clnt_sock,&tmp,4);	//也会发生类型转换
			digs[k]=tmp;			//保存到digs数组中
		}
		read(clnt_sock,&sym,1);		//读取最后的操作数
		result=calc(opd,digs,sym);	//调用calc()函数
		write(clnt_sock,&result,sizeof(result));	//将结果发送回去
		close(clnt_sock);	//关闭
		
	}
	return 0;
}


//客户端代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define MAXN 1024
#define OPSZ 4	
void error_handling(const char *message)
{
	fputs(message,stderr);
	fputc('\n',stderr);
	exit(1);
}
int main(int argc,char *argv[])
{
	int clnt_sock;
	struct sockaddr_in serv_adr;
	char msg[MAXN];
	int opd,result;
	if(argc!=3)
	{
		printf("Usage %s <IP> <PORT>",argv[0]);
		exit(1);
	}
	clnt_sock=socket(PF_INET,SOCK_STREAM,0);	//第一步
	if(clnt_sock==-1)
		error_handling("socket() error");
	
	memset(&serv_adr,0,sizeof(serv_adr));		//填充要连接的服务器端的地址
	serv_adr.sin_family=AF_INET;
	serv_adr.sin_addr.s_addr=inet_addr(argv[1]);
	serv_adr.sin_port=htons(atoi(argv[2]));
	
	if(connect(clnt_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr))==-1)
		error_handling("connect() error");
	else
		printf("connected...\n");	//成功连接之后
	printf("Operand count:");
	scanf("%d",&opd);
	msg[0]=(char)opd;	//强制类型转换
	for(int i=0;i<opd;++i)
	{
		printf("Operand %d:",i+1);
		scanf("%d",(int *)&msg[i*OPSZ+1]);	//4字节int型数据要保存到char数组,因而转换成int指针类型		
	}
	fgetc(stdin);		//读取流中还剩的回车
	fputs("Operator: ",stdout);
	scanf("%c",&msg[opd*OPSZ+1]);	//保存操作符(+ - *)中的一个
	write(clnt_sock,msg,opd*OPSZ+2);	//发送数据给客户端
	read(clnt_sock,&result,4);	//接收服务器端发送的数据
	printf("Operation result:%d \n",result);
	close(clnt_sock);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值