计算器服务器端/客户端示例

实现:

1)客户端连接服务器端后以1字节整数形式传递待算数字个数。

2)客户端向服务器端传递的每个整数型数据占用4字节

3)传递整数型数据后接着传递运算符。运算符信息占用1字节

4)选择字符+   -   *   之一传递

5)服务器端以4字节整数型向客户端传回运算的结果

6)客户端得到的运算结果后终止与服务器端的连接、


数据格式:

                                

服务器:

#include<stdlib.h>
#include<stdio.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib") 
#define bufsize 1024
int caculate1(char marknum, int* number, int count2);
void main() {
	WSADATA wsadata;
	SOCKET hclientsocket, hserversocket;
	SOCKADDR_IN hclientaddr, hserveraddr;
	int zsClientAddr;
	char message[bufsize]="\0";
	int count, recvlen, recvcnt,result=0;


	//winsock库初始化
	WSAStartup(MAKEWORD(2, 2), &wsadata);
	hserversocket = socket(PF_INET, SOCK_STREAM, 0);//创建服务器端套接字(IPV4  面向连接传输) 
	if (hserversocket == INVALID_SOCKET) printf( "socket 创建失败\n");

	memset(&hserveraddr, 0, sizeof(hserveraddr));   //清空
	hserveraddr.sin_family = AF_INET; //IPv4
	hserveraddr.sin_addr.s_addr = htonl(INADDR_ANY);  //获取本机地址
	hserveraddr.sin_port = htons(atoi("9999"));
	//绑定地址
	if (bind(hserversocket, (SOCKADDR*)&hserveraddr, sizeof(hserveraddr)) == SOCKET_ERROR)
		 printf("bind 失败\n");

	//监听服务器,客户端最大等待数目为5
	if (listen(hserversocket, 5) == SOCKET_ERROR)  printf("listen 失败\n");
	 printf("服务器启动成功!\n");
	//接受客户端
	zsClientAddr = sizeof(hclientaddr);
	hclientsocket = accept(hserversocket, (SOCKADDR*)&hclientaddr, &zsClientAddr);
	if (hclientsocket == INVALID_SOCKET)  printf("accept 错误!\n");
	else  printf("已有客户端连接!\n");
	while (1) {
		//接受数字数目
		count = 0;
		recv(hclientsocket, (char*)&count, 1, 0);
		recvlen = 0;
		while ((count*4+1)>recvlen) {
			recvcnt = recv(hclientsocket, &message[recvlen], bufsize - 1, 0);
			recvlen += recvcnt;
		}
		result = caculate1(message[recvlen - 1], (int*)message, count);
		printf("%d\n", result);
		if (send(hclientsocket,(char*)&result, 4, 0) == SOCKET_ERROR)
			 printf("send result 错误\n");
	}
	getchar();
	closesocket(hclientsocket);
	closesocket(hserversocket);
	WSACleanup();
}
int caculate1(char marknum, int* number, int count2) {  //转成int数组进行计算
	int result = number[0];
	switch (marknum)
	{
	case'+':
		for (int i = 1; i < count2; i++) {
			result += number[i];
		}
		break;
	case '-':
		for (int i = 1; i < count2; i++) {
			result -= number[i];
		}
		break;
	case '*':
		for (int i = 1; i < count2; i++) {
			result *= number[i];
		}
		break;
	default:printf("输入的值错误!\n");
		break;
	}
	return result;
}
客户端

#include<stdlib.h>
#include<stdio.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib") 
#define bufsize  1024

void main() {
	WSADATA wsadata;
	SOCKET hsocket;
	SOCKADDR_IN hsocketaddr;
	char message[bufsize] = "\0";
	int count,result,number;
	char *cache=NULL;

	WSAStartup(MAKEWORD(2, 2), &wsadata);
	//创建socket
	hsocket = socket(PF_INET, SOCK_STREAM, 0);
	if (hsocket == INVALID_SOCKET) printf("socket 创建失败!\n" );

	memset(&hsocketaddr, 0, sizeof(hsocketaddr));//清空
	hsocketaddr.sin_family = AF_INET;		//ipv4
	hsocketaddr.sin_addr.s_addr = inet_addr("127.0.0.1");  //访问本机地址
	hsocketaddr.sin_port = htons(atoi("9999"));

	//连接
	if (connect(hsocket, (SOCKADDR*)&hsocketaddr, sizeof(hsocketaddr)) == SOCKET_ERROR)
		printf("connet 失败!\n");
	while (1) {
		printf("输入数字的数目:");
		scanf("%d", &count);
		message[0] = (char)count; //1字节整数类型,所以计算的数不能超过1字节整数
		for (int i = 0; i < count; i++) {
			printf("请输入数字的值:");
			scanf("%d",(int*)&message[i*4+1]);
		}
		fgetc(stdin);  //删除缓冲区中的\n
		printf("请输入操作符:");
		scanf("%c",&message[count * 4 + 1]); //不删除\n 此步骤无法执行
		if(send(hsocket, message, count * 4 + 2, 0)==SOCKET_ERROR)
			printf("send message 错误!!\n");
		if (recv(hsocket, (char*)&result, 4, 0)==SOCKET_ERROR) //4字节的result
			printf("recv result 错误!!\n");
		printf("结果是 %d\n",result );
	}
	getchar();
	closesocket(hsocket);
	WSACleanup();
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值