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

来源:互联网 发布:音乐声音放大软件 编辑:程序博客网 时间:2024/06/03 12:40

实现:

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 1024int 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; //IPv4hserveraddr.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");//监听服务器,客户端最大等待数目为5if (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  1024void main() {WSADATA wsadata;SOCKET hsocket;SOCKADDR_IN hsocketaddr;char message[bufsize] = "\0";int count,result,number;char *cache=NULL;WSAStartup(MAKEWORD(2, 2), &wsadata);//创建sockethsocket = socket(PF_INET, SOCK_STREAM, 0);if (hsocket == INVALID_SOCKET) printf("socket 创建失败!\n" );memset(&hsocketaddr, 0, sizeof(hsocketaddr));//清空hsocketaddr.sin_family = AF_INET;//ipv4hsocketaddr.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);  //删除缓冲区中的\nprintf("请输入操作符:");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字节的resultprintf("recv result 错误!!\n");printf("结果是 %d\n",result );}getchar();closesocket(hsocket);WSACleanup();}



0 0