实现:
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();
}