目录
一、问题介绍
二、代码
1、serMain.cpp
2、server.h
3、server.cpp
4、cliMain.cpp
5、client.h
6、client.cpp
7、message.h
8、message.cpp
9、udp.mk
三、运行结果
一、问题介绍
基于UDP 的网络通信,实现信息的传输(加减乘除运算)
服务端命令行输入:./serMain 8888
客户端命令行输入:./cliMain 127.0.0.1 8888
函数参考博客
二、代码
1、serMain.cpp
#include
#include"server.h"
int main(int argc,char* argv[]){
server(atoi(argv[1]));
return 0;
}
2、server.h
void server(const int port);
3、server.cpp
#include
#include
#include
#include
#include
#include
#include
#include"server.h"
#include"message.h"
using SAI=struct sockaddr_in;
using SA=struct sockaddr;
const int LEN=sizeof(Message)+1;
void handle_mes(Message& m){
switch(m.op){
case 0:
m.res=m.oprand1+m.oprand2;
break;
case 1:
m.res=m.oprand1-m.oprand2;
break;
case 2:
m.res=m.oprand1*m.oprand2;
break;
case 3:
if(m.oprand2!=0){
m.res=m.oprand1/m.oprand2;
}else{
m.status='F';
}
break;
default:
m.status='N';
break;
}
}
void process(const int confd){
while(true){
char buf[LEN]={' '};
Message m;
memset(&m,0,sizeof(m));
SAI caddr;
memset(&caddr,0,sizeof(caddr));
socklen_t calen=sizeof(caddr);
recvfrom(confd,buf,LEN-1,0,(SA*)&caddr,&calen);
decode(buf,m);
handle_mes(m);
encode(buf,m);
sendto(confd,buf,LEN-1,0,(SA*)&caddr,calen);
}
}
void server(const int port){
int confd;
do{
int confd=socket(PF_INET,SOCK_DGRAM,0);
if(confd == -1){
std::cerr<<"socket wrongn";
break;
}
SAI saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_addr.s_addr=htonl(INADDR_ANY);
saddr.sin_port=htons(port);
if(bind(confd,(SA*)&saddr,sizeof(saddr)) == -1){
std::cerr<<"listen wrongn";
break;
}
process(confd);
}while(0);
close(confd);
}
4、cliMain.cpp
#include
#include"client.h"
int main(int argc,char *argv[]){
client(argv[1],atoi(argv[2]));
return 0;
}
5、client.h
void client(const char* ip,const int port);
6、client.cpp
#include
#include
#include
#include
#include
#include
#include"client.h"
#include"message.h"
using SAI=struct sockaddr_in;
using SA=struct sockaddr;
const int LEN=sizeof(Message)+1;
void process(const int confd,SAI& saddr){
while(true){
char buf[LEN]={' '};
Message m;
memset(&m,0,sizeof(m));
std::cout<<"please enter expression:n";
std::cin>>m;
if(std::cin.eof()) break;
m.status='S';
encode(buf,m);
sendto(confd,buf,LEN-1,0,(SA*)&saddr,sizeof(saddr));
recvfrom(confd,buf,LEN-1,0,NULL,NULL);
decode(buf,m);
std::cout<
7、message.h
#include
struct Message{
int oprand1;
int op;
int oprand2;
int res;
char status;
};
std::istream &operator >>(std::istream& in, Message& m);
std::ostream &operator <<(std::ostream& out,const Message& m);
void decode(const char* buf,Message& m);
void encode(char* buf,const Message& m);
8、message.cpp
#include
#include
#include"message.h"
std::istream& operator >>(std::istream& in ,Message& m){
in>>m.oprand1>>m.op>>m.oprand2;
return in;
}
std::ostream& operator <<(std::ostream& out ,const Message& m){
char ops[]={'+','-','*','/'};
if(m.status=='S'){
out<
9、udp.mk
GCC=g++
CFLAG=-c
OFLAG=-o
SEXE=serMain
SOBJ=serMain.o server.o message.o
CEXE=cliMain
COBJ=cliMain.o client.o message.o
all:${SEXE} ${CEXE}
${SEXE}:${SOBJ}
${GCC} ${OFLAG} $@ $^
${CEXE}:${COBJ}
${GCC} ${OFLAG} $@ $^
%.o:%.cpp
${GCC} ${CFLAG} $^
clean:
rm *.o
三、运行结果
#include#include"server.h" int main(int argc,char* argv[]){ server(atoi(argv[1])); return 0; }
2、server.h
void server(const int port);
3、server.cpp
#include
#include
#include
#include
#include
#include
#include
#include"server.h"
#include"message.h"
using SAI=struct sockaddr_in;
using SA=struct sockaddr;
const int LEN=sizeof(Message)+1;
void handle_mes(Message& m){
switch(m.op){
case 0:
m.res=m.oprand1+m.oprand2;
break;
case 1:
m.res=m.oprand1-m.oprand2;
break;
case 2:
m.res=m.oprand1*m.oprand2;
break;
case 3:
if(m.oprand2!=0){
m.res=m.oprand1/m.oprand2;
}else{
m.status='F';
}
break;
default:
m.status='N';
break;
}
}
void process(const int confd){
while(true){
char buf[LEN]={' '};
Message m;
memset(&m,0,sizeof(m));
SAI caddr;
memset(&caddr,0,sizeof(caddr));
socklen_t calen=sizeof(caddr);
recvfrom(confd,buf,LEN-1,0,(SA*)&caddr,&calen);
decode(buf,m);
handle_mes(m);
encode(buf,m);
sendto(confd,buf,LEN-1,0,(SA*)&caddr,calen);
}
}
void server(const int port){
int confd;
do{
int confd=socket(PF_INET,SOCK_DGRAM,0);
if(confd == -1){
std::cerr<<"socket wrongn";
break;
}
SAI saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_addr.s_addr=htonl(INADDR_ANY);
saddr.sin_port=htons(port);
if(bind(confd,(SA*)&saddr,sizeof(saddr)) == -1){
std::cerr<<"listen wrongn";
break;
}
process(confd);
}while(0);
close(confd);
}
4、cliMain.cpp
#include
#include"client.h"
int main(int argc,char *argv[]){
client(argv[1],atoi(argv[2]));
return 0;
}
5、client.h
void client(const char* ip,const int port);
6、client.cpp
#include
#include
#include
#include
#include
#include
#include"client.h"
#include"message.h"
using SAI=struct sockaddr_in;
using SA=struct sockaddr;
const int LEN=sizeof(Message)+1;
void process(const int confd,SAI& saddr){
while(true){
char buf[LEN]={' '};
Message m;
memset(&m,0,sizeof(m));
std::cout<<"please enter expression:n";
std::cin>>m;
if(std::cin.eof()) break;
m.status='S';
encode(buf,m);
sendto(confd,buf,LEN-1,0,(SA*)&saddr,sizeof(saddr));
recvfrom(confd,buf,LEN-1,0,NULL,NULL);
decode(buf,m);
std::cout<
7、message.h
#include
struct Message{
int oprand1;
int op;
int oprand2;
int res;
char status;
};
std::istream &operator >>(std::istream& in, Message& m);
std::ostream &operator <<(std::ostream& out,const Message& m);
void decode(const char* buf,Message& m);
void encode(char* buf,const Message& m);
8、message.cpp
#include
#include
#include"message.h"
std::istream& operator >>(std::istream& in ,Message& m){
in>>m.oprand1>>m.op>>m.oprand2;
return in;
}
std::ostream& operator <<(std::ostream& out ,const Message& m){
char ops[]={'+','-','*','/'};
if(m.status=='S'){
out<
9、udp.mk
GCC=g++
CFLAG=-c
OFLAG=-o
SEXE=serMain
SOBJ=serMain.o server.o message.o
CEXE=cliMain
COBJ=cliMain.o client.o message.o
all:${SEXE} ${CEXE}
${SEXE}:${SOBJ}
${GCC} ${OFLAG} $@ $^
${CEXE}:${COBJ}
${GCC} ${OFLAG} $@ $^
%.o:%.cpp
${GCC} ${CFLAG} $^
clean:
rm *.o
三、运行结果
#include#include #include #include #include #include #include #include"server.h" #include"message.h" using SAI=struct sockaddr_in; using SA=struct sockaddr; const int LEN=sizeof(Message)+1; void handle_mes(Message& m){ switch(m.op){ case 0: m.res=m.oprand1+m.oprand2; break; case 1: m.res=m.oprand1-m.oprand2; break; case 2: m.res=m.oprand1*m.oprand2; break; case 3: if(m.oprand2!=0){ m.res=m.oprand1/m.oprand2; }else{ m.status='F'; } break; default: m.status='N'; break; } } void process(const int confd){ while(true){ char buf[LEN]={' '}; Message m; memset(&m,0,sizeof(m)); SAI caddr; memset(&caddr,0,sizeof(caddr)); socklen_t calen=sizeof(caddr); recvfrom(confd,buf,LEN-1,0,(SA*)&caddr,&calen); decode(buf,m); handle_mes(m); encode(buf,m); sendto(confd,buf,LEN-1,0,(SA*)&caddr,calen); } } void server(const int port){ int confd; do{ int confd=socket(PF_INET,SOCK_DGRAM,0); if(confd == -1){ std::cerr<<"socket wrongn"; break; } SAI saddr; memset(&saddr,0,sizeof(saddr)); saddr.sin_family=AF_INET; saddr.sin_addr.s_addr=htonl(INADDR_ANY); saddr.sin_port=htons(port); if(bind(confd,(SA*)&saddr,sizeof(saddr)) == -1){ std::cerr<<"listen wrongn"; break; } process(confd); }while(0); close(confd); }
4、cliMain.cpp
#include
#include"client.h"
int main(int argc,char *argv[]){
client(argv[1],atoi(argv[2]));
return 0;
}
5、client.h
void client(const char* ip,const int port);
6、client.cpp
#include
#include
#include
#include
#include
#include
#include"client.h"
#include"message.h"
using SAI=struct sockaddr_in;
using SA=struct sockaddr;
const int LEN=sizeof(Message)+1;
void process(const int confd,SAI& saddr){
while(true){
char buf[LEN]={' '};
Message m;
memset(&m,0,sizeof(m));
std::cout<<"please enter expression:n";
std::cin>>m;
if(std::cin.eof()) break;
m.status='S';
encode(buf,m);
sendto(confd,buf,LEN-1,0,(SA*)&saddr,sizeof(saddr));
recvfrom(confd,buf,LEN-1,0,NULL,NULL);
decode(buf,m);
std::cout<
7、message.h
#include
struct Message{
int oprand1;
int op;
int oprand2;
int res;
char status;
};
std::istream &operator >>(std::istream& in, Message& m);
std::ostream &operator <<(std::ostream& out,const Message& m);
void decode(const char* buf,Message& m);
void encode(char* buf,const Message& m);
8、message.cpp
#include
#include
#include"message.h"
std::istream& operator >>(std::istream& in ,Message& m){
in>>m.oprand1>>m.op>>m.oprand2;
return in;
}
std::ostream& operator <<(std::ostream& out ,const Message& m){
char ops[]={'+','-','*','/'};
if(m.status=='S'){
out<
9、udp.mk
GCC=g++
CFLAG=-c
OFLAG=-o
SEXE=serMain
SOBJ=serMain.o server.o message.o
CEXE=cliMain
COBJ=cliMain.o client.o message.o
all:${SEXE} ${CEXE}
${SEXE}:${SOBJ}
${GCC} ${OFLAG} $@ $^
${CEXE}:${COBJ}
${GCC} ${OFLAG} $@ $^
%.o:%.cpp
${GCC} ${CFLAG} $^
clean:
rm *.o
三、运行结果
void client(const char* ip,const int port);
6、client.cpp
#include
#include
#include
#include
#include
#include
#include"client.h"
#include"message.h"
using SAI=struct sockaddr_in;
using SA=struct sockaddr;
const int LEN=sizeof(Message)+1;
void process(const int confd,SAI& saddr){
while(true){
char buf[LEN]={' '};
Message m;
memset(&m,0,sizeof(m));
std::cout<<"please enter expression:n";
std::cin>>m;
if(std::cin.eof()) break;
m.status='S';
encode(buf,m);
sendto(confd,buf,LEN-1,0,(SA*)&saddr,sizeof(saddr));
recvfrom(confd,buf,LEN-1,0,NULL,NULL);
decode(buf,m);
std::cout<
7、message.h
#include
struct Message{
int oprand1;
int op;
int oprand2;
int res;
char status;
};
std::istream &operator >>(std::istream& in, Message& m);
std::ostream &operator <<(std::ostream& out,const Message& m);
void decode(const char* buf,Message& m);
void encode(char* buf,const Message& m);
8、message.cpp
#include
#include
#include"message.h"
std::istream& operator >>(std::istream& in ,Message& m){
in>>m.oprand1>>m.op>>m.oprand2;
return in;
}
std::ostream& operator <<(std::ostream& out ,const Message& m){
char ops[]={'+','-','*','/'};
if(m.status=='S'){
out<
9、udp.mk
GCC=g++
CFLAG=-c
OFLAG=-o
SEXE=serMain
SOBJ=serMain.o server.o message.o
CEXE=cliMain
COBJ=cliMain.o client.o message.o
all:${SEXE} ${CEXE}
${SEXE}:${SOBJ}
${GCC} ${OFLAG} $@ $^
${CEXE}:${COBJ}
${GCC} ${OFLAG} $@ $^
%.o:%.cpp
${GCC} ${CFLAG} $^
clean:
rm *.o
三、运行结果
7、message.h
#include
struct Message{
int oprand1;
int op;
int oprand2;
int res;
char status;
};
std::istream &operator >>(std::istream& in, Message& m);
std::ostream &operator <<(std::ostream& out,const Message& m);
void decode(const char* buf,Message& m);
void encode(char* buf,const Message& m);
8、message.cpp
#include
#include
#include"message.h"
std::istream& operator >>(std::istream& in ,Message& m){
in>>m.oprand1>>m.op>>m.oprand2;
return in;
}
std::ostream& operator <<(std::ostream& out ,const Message& m){
char ops[]={'+','-','*','/'};
if(m.status=='S'){
out<
9、udp.mk
GCC=g++
CFLAG=-c
OFLAG=-o
SEXE=serMain
SOBJ=serMain.o server.o message.o
CEXE=cliMain
COBJ=cliMain.o client.o message.o
all:${SEXE} ${CEXE}
${SEXE}:${SOBJ}
${GCC} ${OFLAG} $@ $^
${CEXE}:${COBJ}
${GCC} ${OFLAG} $@ $^
%.o:%.cpp
${GCC} ${CFLAG} $^
clean:
rm *.o
三、运行结果
#include #include#include"message.h" std::istream& operator >>(std::istream& in ,Message& m){ in>>m.oprand1>>m.op>>m.oprand2; return in; } std::ostream& operator <<(std::ostream& out ,const Message& m){ char ops[]={'+','-','*','/'}; if(m.status=='S'){ out< 9、udp.mk
GCC=g++ CFLAG=-c OFLAG=-o SEXE=serMain SOBJ=serMain.o server.o message.o CEXE=cliMain COBJ=cliMain.o client.o message.o all:${SEXE} ${CEXE} ${SEXE}:${SOBJ} ${GCC} ${OFLAG} $@ $^ ${CEXE}:${COBJ} ${GCC} ${OFLAG} $@ $^ %.o:%.cpp ${GCC} ${CFLAG} $^ clean: rm *.o三、运行结果



