1、要求:
服务端从客户端获取多个数字和运算符信息,服务端收到数字后对其进行加减乘运算,然后把结果传给客户端。
2、客户端实现:client.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
#define BUF_SIZE 1024
#define RLT_SIZE 4
#define OPSZ 4
void ErrorHandling(char *message);
int main(int argc,char *argv[])
{
WSADATA wsadata;
SOCKET hsocket;
char opmsg[BUF_SIZE];
int result,opndCnt,i;
SOCKADDR_IN servAdr;
if (argc!=3){
printf("usage:%s <ip> <port>\n",argv[0]);
exit(1);
}
//初始化套接字库,主版本2,副版本2
if (WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
ErrorHandling("WSAStartup() error");
//创建套接字
hsocket = socket(PF_INET,SOCK_STREAM,0);
//判断套接字是否有效
if (hsocket==INVALID_SOCKET)
ErrorHandling("socket() error");
//初始化地址信息
memset(&servAdr,0,sizeof(servAdr));
servAdr.sin_family = AF_INET;//指定地址族
servAdr.sin_addr.s_addr = inet_addr(argv[1]);//
servAdr.sin_port = htons(atoi(argv[2]));//把short数据从主机字节序转化为网络字节序 作为地址端口号
//客户端向服务器发送连接请求
if(connect(hsocket,(SOCKADDR*)&servAdr,sizeof(servAdr))==SOCKET_ERROR)
ErrorHandling("connect() error");
else
puts("connected...");
fputs("operand count: ",stdout);
//输入运算数个数
scanf("%d",&opndCnt);
opmsg[0] = (char)opndCnt;
//输入运算数
for (i=0;i<opndCnt;i++){
printf("operand count:",i+1);
scanf("%d",(int*)&opmsg[i*OPSZ+1]);
}
fgetc(stdin);
fputs("operator: ",stdout);
scanf("%c",&opmsg[opndCnt*OPSZ+1]);
//数据传输
send(hsocket,opmsg,opndCnt*OPSZ+2,0);
//-----接收服务器发来的消息----------
recv(hsocket,(char*)&result,RLT_SIZE,0);
//输出运算结果
printf("operation result: %d\n",result);
//关闭套接字
closesocket(hsocket);
//注销套接字库
WSACleanup();
return 0;
}
//错误处理函数
void ErrorHandling(char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
3、服务端实现:server.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
#define BUF_SIZE 1024
#define OPSZ 4
void ErrorHandling(char *message);
int calculate(int opnum,int opnds[],char operater);
int main(int argc,char *argv[]){
WSADATA wsadata;
SOCKET hServSock,hClntSock;
char opinfo[BUF_SIZE];
int result,opndCnt,i;
int recvCnt, recvLen;
SOCKADDR_IN servAdr,clntAdr;
int clntAdrSize;
if (argc!=2){
printf("usage: %s <port>\n",argv[0]);
exit(1);
}
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(argv[1]));
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);
recv(hClntSock,(char*)&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;
}
int calculate(int opnum,int opnds[],char op){
int res = opnds[0],i;
switch(op){
case '+':
for (i=1;i<opnum;i++)
res += opnds[i];
break;
case '-':
for (i=1;i<opnum;i++)
res -= opnds[i];
break;
case '*':
for (i=1;i<opnum;i++)
res *= opnds[i];
break;
}
return res;
}
//错误处理函数
void ErrorHandling(char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}