client-server交互计算器-server端/Windows

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<winsock2.h>

#define BUF_SIZE 1024
#define OPSZ 4
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void ErrorHandling(char *message);
int calculate(int opnum,int opnds[],char oprator);
int main(int argc, char *argv[]) {
	char PORT[] = "9190";//端口 
	WSADATA wsaData;
	SOCKET hServSock,hClntSock;
	char message[BUF_SIZE];
	char opinfo[BUF_SIZE];
	int strLen, i;
	int result,opndCnt;
	int recvCnt, recvLen;
	SOCKADDR_IN servAdr, clntAdr;
	int clntAdrSize;
	if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0) {
		ErrorHandling("WSAStartup() error!");
	}
	hServSock = socket(PF_INET,SOCK_STREAM,0);
	if (hServSock == INVALID_SOCKET) {
		ErrorHandling("socket() error!");
	}
	memset(&servAdr,0,sizeof(servAdr));
	servAdr.sin_family = AF_INET;
	servAdr.sin_addr.s_addr = htonl(INADDR_ANY);
	servAdr.sin_port = htons(atoi(PORT));
	
	if (bind(hServSock,(SOCKADDR*)&servAdr,sizeof(servAdr)) == SOCKET_ERROR){
		ErrorHandling("BIND() error!");
	}
	if (listen(hServSock,5) == SOCKET_ERROR) {
		ErrorHandling("listen() error!");
	}
	
	clntAdrSize = sizeof(clntAdr);
	
	for (i = 0; i < 5;i++) {
		opndCnt = 0;
		hClntSock = accept(hServSock,(SOCKADDR*)&clntAdr,&clntAdrSize);
		if (hClntSock == -1) {
			ErrorHandling("accept() error!");
		} else {
			printf("Connected clint %d \n",i+1);
		}
		recv(hClntSock,&opndCnt,1,0);
		
		recvLen = 0;
		while ((opndCnt*OPSZ+1)>recvLen) {
			recvCnt = recv(hClntSock,&opinfo[recvLen],BUF_SIZE-1,0);
			recvLen+=recvCnt;
		}
		result = calculate(opndCnt,(int*)opinfo,opinfo[recvLen-1]);
		send(hClntSock,(char*)&result,sizeof(result),0);
		closesocket(hClntSock);
	}
	closesocket(hServSock);
	WSACleanup();
	return 0 ;
}
void ErrorHandling(char *message) {
	fputs(message,stderr);
	fputc('\n',stderr);
	exit(1);
}
int calculate(int opnum,int opnds[],char op){
	int result=opnds[0],i;
	
	switch(op)
	{
		case '+':
			for(i = 1; i < opnum;i++) {
				result += opnds[i];
			}
			break;
		case '-':
			for(i = 1; i < opnum;i++) {
				result -= opnds[i];
			}	
			break;
		case '*':
			for(i = 1; i < opnum;i++) {
				result *= opnds[i];
			}
			break;		
	}
	return result;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值