修改一下昨天的案例,在linux下实现。在linux下使用Codeblocks将生成的两个执行文件在终端运行即可
删除了客户端输入的cls命令,注意server中的bind()函数在使用前有设置,主要是为了解决问题(如链接所示):https://blog.youkuaiyun.com/s25691011/article/details/73733808
socket详细过程解释参考https://www.cnblogs.com/cy568searchx/p/4211124.html
server.cpp
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <iostream>
#include <netinet/in.h>
using namespace std;
int main(){
//创建套接字
int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(serv_sock==-1){cout<<"Socket build failed."<<endl;}
//将套接字和IP、端口绑定
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
serv_addr.sin_family = AF_INET; //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具体的IP地址
serv_addr.sin_port = htons(1234); //端口
const int on=1;
setsockopt(serv_sock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));//设置使bind在重启后不会出现(linux网络编程/tcp_server中server bind失败原因的)
int bRes=bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if (-1 == bRes) {cout << "Failed to bind." << endl;}
else {cout << "Binding success" << endl;}
//进入监听状态,等待用户发起请求
int lRes=listen(serv_sock, 20);
if (-1 == lRes) {cout << "Failed to listen." << endl;}
else {cout << "Server:Listenning..." << endl;}
//接收客户端请求
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size = sizeof(clnt_addr);
int recvClientSocket = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
if(recvClientSocket==-1){cout<<"Serve receive no client."<<endl;}
else{cout<<"Serve has receive client"<<endl;}
//向客户端发送数据
while(true){
char recvBuf[1024] = {};
int reLen = recv(recvClientSocket, recvBuf, 1024, 0);
if (-1 == reLen) {cout << "Server failed to receive." << endl;}
else{
cout << "Client:" << recvBuf << endl;
if (0 == strcmp("hi", recvBuf)) {
string verData ="Hello, master Wayne.";
int sLen = send(recvClientSocket, (char*)verData.c_str(), verData.length(), 0);
}
else if (0 == strcmp("version", recvBuf)) {
string verData = "Version: 1.0.1\nAuthor: JohnWayne\nReleaseData: 2020-02-09";
int sLen = send(recvClientSocket, (char*)verData.c_str(), verData.length(), 0);
}
else if (0 == strcmp("exit", recvBuf)) {
string verData = "Client request to exit.";
int sLen = send(recvClientSocket, (char*)verData.c_str(), verData.length(), 0);
cout << endl << "Exit server." << endl;
break;
}
else {
cout << "Wrong input:"<<recvBuf << endl;
}
}
}
//关闭套接字
close(recvClientSocket);
close(serv_sock);
return 0;
}
client.cpp
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <cstring>
#include <iostream>
using namespace std;
int main(){
//创建套接字
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock==-1){cout<<"Socket build failed."<<endl;}
else{cout<<"Socket build success."<<endl;}
//向服务器(特定的IP和端口)发起请求
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
serv_addr.sin_family = AF_INET; //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具体的IP地址
serv_addr.sin_port = htons(1234); //端口
int cRes=connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if(cRes==-1){cout<<"Client failed to connect server."<<endl;}
else{cout<<"client has successfully connected to the server."<<endl;}
while(true){
string s;
cout<<"Input data to send:";
getline(cin,s);
write(sock,(char*)s.c_str(),s.length());
if (0 == strcmp("hi", s.c_str())) {
char recvBuf[4024] = {};
int reLen = recv(sock, recvBuf, 4024, 0);
cout << endl << recvBuf << endl << endl;
}
else if (0 == strcmp("version", s.c_str())) {
char recvBuf[4024] = {};
int reLen = recv(sock, recvBuf, 4024, 0);
cout << endl << recvBuf << endl << endl;
}
else if (0 == strcmp("exit", s.c_str())) {
char recvBuf[4024] = {};
int reLen = recv(sock, recvBuf, 4024, 0);
cout << endl << recvBuf << endl << endl;
break;
}
else{cout<<"Wrong Input."<<endl;}
}
//关闭套接字
close(sock);
return 0;
}
此为运行时终端示例