这里都是基于Windows的网络编程
这里用的方法是执行一个操作连接一次,然后操作完之后,客户端和服务器就断开连接了,进行下一步操作就得继续连接。
客户端
student.h
#pragma once;
#include <string>
#include <iostream>
using namespace std;
class Student
{
public:
void setStudent(int n, string nam, double s);
void showStudent();
friend class Teacher;
private:
int num;
char name[32];
double score;
};
teacher.h
#pragma once
#include <string>
#include <iostream>
#include "student.h"
using namespace std;
const int upNum = 1000;
class Teacher
{
public:
Teacher();
virtual ~Teacher();
void work();
void displayStudent();
void insert();
void deleteStudent();
void searchStudent();
void saveStudent();
private:
int N;//用户数目
Student students[upNum];//student()
};
class StudentOperation
{
public:
int type;
Student student;
};
class StudentResult
{
public:
int type;
int result;
int memo;
};
int pass();
int chooseInMenu();
int inputPassword();
main.cpp
#include <iostream>
#include <WinSock2.h>
#include "teacher.h"
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
cout << "*************************************" << endl;
cout << "* 学生成绩管理系统 *" << endl;
cout << "*************************************" << endl;
Teacher t;
t.work();
system("pause");
return 0;
}
work.cpp
#include "student.h"
#include "teacher.h"
#include <iostream>
#include <fstream>
#include <WinSock2.h>
//student funcation
void Student::showStudent()
{
cout << num << " " << name << " " << endl;
}
//teacher funcation
Teacher::Teacher()
{
}
Teacher::~Teacher()
{
}
void Teacher::work()
{
int ichoice;
int j = 0;
while (1)
{
ichoice = chooseInMenu();
switch(ichoice)
{
case 1: insert(); break;
case 2: deleteStudent(); break;
case 3: searchStudent(); break;
case 4: displayStudent(); break;
case 0:
{ system("pause");
exit(1);
}
default: break;
}
}
}
void Teacher::insert()
{
StudentOperation stuop;
stuop.type = 1;
cout << "请输入学号: ";
cin >> stuop.student.num;
cout << endl;
cout << "请输入名字: ";
cin >> stuop.student.name;
cout << endl;
cout << "请输入操作系统成绩: ";
cin >> stuop.student.score;
WSADATA wsaData;
int ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
cout << "win初始化失败" << endl;
system("pause");
exit(1);
}
SOCKET clientsocket;
clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(clientsocket == INVALID_SOCKET)
{
cout << "创建winsocket失败" << endl;
system("pause");
exit(1);
}
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddr.sin_port = htons(6800);
ret = connect(clientsocket, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
if(ret == SOCKET_ERROR)
{
cout << "连接失败" << endl;
system("pause");
exit(1);
}
char * data = (char *)&stuop;
int len = send(clientsocket, data, sizeof(stuop), 0);
if (len == SOCKET_ERROR)
{
cout << "发送失败" << endl;
system("pause");
exit(1);
}
StudentResult sr;
len = recv(clientsocket, (char *)&sr, sizeof(sr), 0);
if(len == SOCKET_ERROR)
{
cout << "接收失败" << endl;
system("pause");
exit(1);
}
//cout << sr.result << endl;
closesocket(clientsocket);
WSACleanup();
}
void Teacher::deleteStudent()
{
StudentOperation stuop;
stuop.type = 2;
cout << "请输入学号:";
cin >> stuop.student.num;
cout << endl;
WSADATA wsaData;
int ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
cout << "win初始化失败" << endl;
system("pause");
exit(1);
}
SOCKET clientsocket;
clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(clientsocket == INVALID_SOCKET)
{
cout << "创建winsocket失败" << endl;
system("pause");
exit(1);
}
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddr.sin_port = htons(6800);
ret = connect(clientsocket, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
if(ret == SOCKET_ERROR)
{
cout << "连接失败" << endl;
system("pause");
exit(1);
}
char * data = (char *)&stuop;
int len = send(clientsocket, data, sizeof(stuop), 0);
if(len == SOCKET_ERROR)
{
cout << "发送失败" << endl;
system("pause");
exit(1);
}
StudentResult st;
len = recv(clientsocket, (char *)&st, sizeof(st), 0);
if(len == SOCKET_ERROR)
{
cout << "接收失败" << endl;
system("pause");
exit(1);
}
//cout << st.result << endl;
closesocket(clientsocket);
WSACleanup();
}
void Teacher::searchStudent()
{
StudentOperation stuop;
stuop.type = 3;
cout << "请输入要修改的同学的学号:";
cin >> stuop.student.num;
WSADATA wsaData;
int ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
cout << "win初始化失败" << endl;
system("pause");
exit(1);
}
SOCKET clientsocket;
clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(clientsocket == INVALID_SOCKET)
{
cout << "创建winsocket失败" << endl;
system("pause");
exit(1);
}
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddr.sin_port = htons(6800);
ret = connect(clientsocket, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
if(ret == SOCKET_ERROR)
{
cout << "连接失败" << endl;
system("pause");
exit(1);
}
char * data = (char *)&stuop;
ret = send(clientsocket, data, sizeof(stuop), 0);
if(ret == SOCKET_ERROR)
{
cout << "发送失败" << endl;
system("pause");
exit(1);
}
StudentResult st;
ret = recv(clientsocket, (char *)&st, sizeof(st), 0);
if(ret == SOCKET_ERROR)
{
cout << "接收失败" << endl;
system("pause");
exit(1);
}
// cout << st.result << endl;
closesocket(clientsocket);
WSACleanup();
cout << "请输入你要修改的成绩: ";
cin >> stuop.student.score;
ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
cout << "win初始化失败" << endl;
system("pause");
exit(1);
}
clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(clientsocket == INVALID_SOCKET)
{
cout << "创建winsocket失败" << endl;
system("pause");
exit(1);
}
serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddr.sin_port = htons(6800);
ret = connect(clientsocket, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
if(ret == SOCKET_ERROR)
{
cout << "连接失败" << endl;
system("pause");
exit(1);
}
ret = send(clientsocket, data, sizeof(stuop), 0);
if(ret == SOCKET_ERROR)
{
cout << "发送失败" << endl;
system("pause");
exit(1);
}
StudentResult sr;
ret = recv(clientsocket, (char *)&sr, sizeof(sr), 0);
if(ret == SOCKET_ERROR)
{
cout << "接收失败" << endl;
system("pause");
exit(1);
}
else
{
cout << "修改信息成功" << endl;
}
closesocket(clientsocket);
WSACleanup();
}
void Teacher::displayStudent()
{
StudentOperation stuop;
stuop.type = 4;
WSADATA wsaData;
int ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
cout << "win初始化失败" << endl;
system("pause");
exit(1);
}
SOCKET clientsocket;
clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(clientsocket == INVALID_SOCKET)
{
cout << "创建winsocket失败" << endl;
system("pause");
exit(1);
}
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddr.sin_port = htons(6800);
ret = connect(clientsocket, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
if(ret == SOCKET_ERROR)
{
cout << "连接失败" << endl;
system("pause");
exit(1);
}
char *data = (char *)&stuop;
ret = send(clientsocket, data, sizeof(stuop),0);
if(ret == SOCKET_ERROR)
{
cout << "发送失败" << endl;
system("pause");
exit(1);
}
StudentResult st;
ret = recv(clientsocket, (char *)&st, sizeof(st), 0);
if(ret == SOCKET_ERROR)
{
cout << "接收失败" << endl;
system("pause");
exit(1);
}
//cout << st.result << endl;
closesocket(clientsocket);
WSACleanup();
ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
cout << "win初始化失败" << endl;
system("pause");
exit(1);
}
clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(clientsocket == INVALID_SOCKET)
{
cout << "创建winsocket失败" << endl;
system("pause");
exit(1);
}
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddr.sin_port = htons(6800);
ret = connect(clientsocket, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
if(ret == SOCKET_ERROR)
{
cout << "连接失败" << endl;
system("pause");
exit(1);
}
while (recv(clientsocket, (char*)&stuop, sizeof(stuop), 0))
{
cout << "number :" << stuop.student.num << ", name : " << stuop.student.name << ", score : " << stuop.student.score << endl;
}
closesocket(clientsocket);
WSACleanup();
}
int chooseInMenu()
{
int i;
while (1)
{
cout << endl;
cout << "+------------------------------------+" << endl;
cout << "+ 1.插入信息 2.删除信息 +" << endl;
cout << "+ 3.修改信息 4.显示信息 +" << endl;
cout << "+-------------------------------------+" << endl;
cout << "+ 0.退出 +" << endl;
cout << "+------------------------------------+" << endl;
cout << "请输入操作指令:";
cin >> i;
if (i >= 0 && i <= 9)
break;
else
cout << "请重新输入" << endl;
}
return i;
}
服务器
student.h
#pragma once
#include <string>
#include <iostream>
using namespace std;
class Student
{
public:
int num;
char name[32];
double score;
};
main.cpp
#include <iostream>
#include <WinSock2.h>
#include <fstream>
#include <vector>
#include <list>
#include "student.h"
#include "studentku.h"
#pragma comment(lib, "ws2_32.lib")
using namespace std;
class StudentOperation
{
public:
int type;
Student student;
};
class StudentResult
{
public:
int type;
int result;
int memo;
};
StudentOperation recvStudent();
list<Student> stulist;
int main()
{
vector<Student> stulist;
while (true)
{
try
{
StudentOperation op = recvStudent();
if(op.type == 1)
{
stulist.push_back(op.student);
}
else if(op.type == 2)
{
cout << "删除学号为:" << op.student.num << endl;
for(vector<Student>::iterator it = stulist.begin(); it != stulist.end(); it++)
{
if(it->num == op.student.num)
{
stulist.erase(it, it+1);
break;
}
}
}
else if(op.type == 3)
{
cout << "修改的学生的学号为:" << op.student.num << endl;
vector<Student>::iterator it;
for(it = stulist.begin(); it != stulist.end(); it++)
{
if(it->num == op.student.num)
{
break;
}
}
WSADATA wsaData;
StudentOperation op;
op.type = 3;
int ret;
ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
cout << "win初始化失败, 错误编号为" << ret << endl;
break;
}
SOCKET serversocket;
serversocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(serversocket == INVALID_SOCKET)
{
cout << "winsock建立失败" << WSAGetLastError() << endl;
system("pause");
break;
}
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddr.sin_port = htons(6800);
ret = bind(serversocket, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
if(ret == SOCKET_ERROR)
{
cout << "绑定失败" << WSAGetLastError() << endl;
system("pause");
break;
}
ret = listen(serversocket, 5);
if(ret == SOCKET_ERROR)
{
cout << "监听失败" << WSAGetLastError() << endl;
system("pause");
break;
}
struct sockaddr_in clientaddr;
int length = sizeof(clientaddr);
SOCKET acceptsocket = accept(serversocket, (struct sockaddr*)&clientaddr, &length);
if(acceptsocket == INVALID_SOCKET)
{
cout << "接受失败" << WSAGetLastError() << endl;
system("pause");
break;
}
int count = recv(acceptsocket, (char *)&op, sizeof(op), 0);
if(count == SOCKET_ERROR)
{
cout << "接收失败" << endl;
system("pause");
break;
}
StudentResult sr;
char *data =(char *)&sr;
it->score = op.student.score;
sr.result = 0;
count = send(acceptsocket, data, sizeof(sr), 0);
if(count == SOCKET_ERROR)
{
cout << "发送失败" << endl;
system("pause");
break;
}
closesocket(serversocket);
closesocket(acceptsocket);
WSACleanup();
}
else if(op.type == 4)
{
WSADATA wsaData;
StudentOperation op;
op.type = 4;
int ret;
ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
cout << "win初始化失败, 错误编号为" << ret << endl;
break;
}
SOCKET serversocket;
serversocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(serversocket == INVALID_SOCKET)
{
cout << "winsock建立失败" << WSAGetLastError() << endl;
system("pause");
break;
}
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddr.sin_port = htons(6800);
ret = bind(serversocket, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
if(ret == SOCKET_ERROR)
{
cout << "绑定失败" << WSAGetLastError() << endl;
system("pause");
break;
}
ret = listen(serversocket, 5);
if(ret == SOCKET_ERROR)
{
cout << "监听失败" << WSAGetLastError() << endl;
system("pause");
break;
}
struct sockaddr_in clientaddr;
int length = sizeof(clientaddr);
SOCKET acceptsocket = accept(serversocket, (struct sockaddr*)&clientaddr, &length);
if(acceptsocket == INVALID_SOCKET)
{
cout << "接受失败" << WSAGetLastError() << endl;
system("pause");
break;
}
vector<Student>::iterator it;
for(it = stulist.begin(); it != stulist.end(); it++)
{
strcpy(op.student.name, it->name);
op.student.num = it->num;
op.student.score = it->score;
ret = send(acceptsocket, (char *)&op, sizeof(op), 0);
if(ret == SOCKET_ERROR)
{
cout << "发送失败" << endl;
system("pause");
break;
}
}
closesocket(serversocket);
closesocket(acceptsocket);
WSACleanup();
}
if(op.type != 4)
{
fstream fs("i:\\code\\teachernet.txt", ios::out);
for(vector<Student>::iterator it = stulist.begin(); it != stulist.end(); it++)
{
fs << it->num << "\t" << it->name << "\t" << it->score << endl;
}
fs.close();
}
}
catch(...)
{
cout << "error" << endl;
system("pause");
return -1;
}
}
system("pause");
return 0;
}
StudentOperation recvStudent()
{
WSADATA wsaData;
StudentOperation op;
op.type = 1;
int ret;
ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
cout << "win初始化失败, 错误编号为" << ret << endl;
return op;
}
SOCKET serversocket;
serversocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(serversocket == INVALID_SOCKET)
{
cout << "winsock建立失败" << WSAGetLastError() << endl;
system("pause");
return op;
}
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddr.sin_port = htons(6800);
ret = bind(serversocket, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
if(ret == SOCKET_ERROR)
{
cout << "绑定失败" << WSAGetLastError() << endl;
system("pause");
return op;
}
ret = listen(serversocket, 5);
if(ret == SOCKET_ERROR)
{
cout << "监听失败" << WSAGetLastError() << endl;
system("pause");
return op;
}
struct sockaddr_in clientaddr;
int length = sizeof(clientaddr);
SOCKET acceptsocket = accept(serversocket, (struct sockaddr*)&clientaddr, &length);
if(acceptsocket == INVALID_SOCKET)
{
cout << "接受失败" << WSAGetLastError() << endl;
system("pause");
return op;
}
int count = recv(acceptsocket, (char *)&op, sizeof(op), 0);
if(count == SOCKET_ERROR)
{
cout << "接收失败" << endl;
system("pause");
return op;
}
StudentResult sr;
sr.type = op.type;
if(op.type < 1 || op.type > 4)
{
sr.result = -1;
}
sr.result = 0;
count = send(acceptsocket, (char *)&sr, sizeof(sr), 0);
if(count == SOCKET_ERROR)
{
cout << "发送失败" << endl;
system("pause");
return op;
}
closesocket(acceptsocket);
closesocket(serversocket);
return op;
}