5.2 计算器服务器端/客户端示例
来源:互联网 发布:js 多图上传插件 编辑:程序博客网 时间:2024/06/14 06:54
通信过程中一般都需要提前定义好通信协议,TCP中亦是如此。
我们编写计算器的例子,定义好应用层协议:
1.客户端连接到服务器端后以1字节整数形式传递待算数字个数;
2.客户端向服务器端传递的每个整数型数据占用4字节;
3.传递完数据后,接着1个字节运算符;
4.选择字符+,-,*,/;
5.服务器以4字节整数型向客户端传回运算结果;
6.客户端得到运算结果后终止与服务器端的连接。
Server端代码:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#include <sys/socket.h>#define BUF_SIZE 1024#define OPSZ4void error_handling(char *message);int calculate(int opnum,int opnds[],char oprator);int main(int argc, char *argv[]){int serv_sock;int clnt_sock;char opinfo[BUF_SIZE];int result,opnd_cnt,i;int recv_cnt,recv_len;struct sockaddr_in serv_addr;struct sockaddr_in clnt_addr;socklen_t clnt_addr_sz;if(argc != 2){printf("Usage : %s <port>\n",argv[0]);exit(1);}serv_sock = socket(PF_INET,SOCK_STREAM,0);if(serv_sock == -1){error_handling("socket() error");}memset(&serv_addr,0,sizeof(serv_addr));serv_addr.sin_family=AF_INET;serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);serv_addr.sin_port=htons(atoi(argv[1]));if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -1){error_handling("bind() error");}if(listen(serv_sock,5) == -1){error_handling("listen() error");}clnt_addr_sz = sizeof(clnt_addr);for(i=0;i<5;i++){opnd_cnt = 0;clnt_sock = accept(serv_sock,(struct sockaddr *)&clnt_addr,&clnt_addr_sz);read(clnt_sock,&opnd_cnt,1);recv_len = 0;while((opnd_cnt*OPSZ+1)>recv_len){recv_cnt = read(clnt_sock,&opinfo[recv_len],BUF_SIZE-1);recv_len += recv_cnt;}result = calculate(opnd_cnt,(int *)opinfo,opinfo[recv_len-1]);write(clnt_sock,(char *)&result,sizeof(result));close(clnt_sock);}close(serv_sock);return 0;}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;}void error_handling(char *message){fputs(message,stderr);fputs("\n",stderr);exit(1);}
Client端代码:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#include <sys/socket.h>#define BUF_SIZE1024#define RLT_SIZE4#define OPSZ4void error_handling(char *message);int main(int argc,char *argv[]){int sock;char opmsg[BUF_SIZE];int result,opnd_cnt,i;struct sockaddr_in serv_addr;if(argc != 3){printf("Usage : %s <IP> <port>\n",argv[0]);exit(1);}sock = socket(PF_INET,SOCK_STREAM,0);if(sock == -1){error_handling("socket() error");}memset(&serv_addr,0,sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr(argv[1]);serv_addr.sin_port = htons(atoi(argv[2]));if(connect(sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) == -1){error_handling("connect() error\r\n");}else{printf("Connected....");}fputs("Operand count: ",stdout);scanf("%d",&opnd_cnt);opmsg[0] = (char)opnd_cnt;for(i=0;i<opnd_cnt;i++){printf("Operand %d: ",i+1);scanf("%d",(int *)&opmsg[i*OPSZ+1]);}fgetc(stdin);//end charfputs("Operator: ",stdout);scanf("%c",&opmsg[opnd_cnt*OPSZ+1]);write(sock,opmsg,opnd_cnt*OPSZ+2);read(sock,&result,RLT_SIZE);printf("Operation result:%d \n",result);close(sock);return 0;}void error_handling(char *message){fputs(message,stderr);fputs("\n",stderr);exit(1);}
Server端执行结果:
alex@alex-VirtualBox:~/Share/Test/tcpip$ ./op_server 9190
Client执行结果:
alex@alex-VirtualBox:~/Share/Test/tcpip$ ./op_client 127.0.0.1 9190Connected....Operand count: 3Operand 1: 123Operand 2: 123Operand 3: 234Operator: +Operation result:480
应用层可以定义好对应的结构体,会更加直观。
0 0
- 5.2 计算器服务器端/客户端示例
- 计算器服务器端/客户端示例
- VSS2005服务器端/客户端配置示例
- 简单的计算器服务器端/客户端程序
- openVPN服务器端和客户端配置文件示例
- TCP/IP网络编程_计算器服务器端客户端
- Java socket编程服务器端/客户端代码编写示例
- java网络编程之socket网络编程示例(服务器端/客户端)
- java网络编程之socket网络编程示例(服务器端/客户端)
- 命名管道客户端及服务器端简单代码示例
- socket客户端发送消息到服务器端简单示例
- C#线程池多线程Socket通讯 服务器端和客户端示例
- visual studio 中UDP 服务器端和tcp客户端示例
- 适合新手的一个经典socket客户端和服务器端文件传输示例
- 初识客户端和服务器端
- 客户端和服务器端通信
- 服务器端控制客户端显示
- 客户端触发服务器端事件
- 常用SQL语言的类型
- 单片机抢答器
- Activity生命周期和onWindowFocusChanged
- java内部类使用小结
- CSS系列——前端进阶之路:初涉Less
- 5.2 计算器服务器端/客户端示例
- 安装python时出现Ignoring ensurepip failure:pip required SSL/TLS和There are no enabled repos
- Android 开发环境下载地址 -- 百度网盘 adt-bundle android-studio sdk adt 下载
- poj3233(矩阵幂)
- android的socket的问题。。。求救啊
- ListView滾動條高度的計算
- AIDL使用详解(三) 客户端通过AIDL与服务端通信 实例项目
- 常见几种浏览器兼容性问题与解决方案
- Replace Pioneer免注册码的续期方法