服务端代码:server.cpp
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
using namespace std;
int main(int argc, char *argv[]) {
if(argc != 2) {
cerr << "Usage: ./server <port>" << endl;
return -1;
}
int sockfd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
if(sockfd == -1) {
cerr << "Failed to create socket!" << endl;
return -1;
}
struct addrinfo hints;
struct addrinfo *res;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET6;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
int ret = getaddrinfo(NULL, argv[1], &hints, &res);
if(ret != 0) {
cerr << "getaddrinfo failed: " << gai_strerror(ret) << endl;
return -1;
}
if(bind(sockfd, res->ai_addr, res->ai_addrlen) == -1) {
cerr << "Failed to bind!" << endl;
return -1;
}
if(listen(sockfd, SOMAXCONN) == -1) {
cerr << "Failed to listen!" << endl;
return -1;
}
cout << "Waiting for connection..." << endl;
struct sockaddr_storage client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int newsockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len);
if(newsockfd == -1) {
cerr << "Failed to accept!" << endl;
return -1;
}
char client_ip[INET6_ADDRSTRLEN];
inet_ntop(client_addr.ss_family, &(((struct sockaddr_in6 *)&client_addr)->sin6_addr), client_ip, sizeof(client_ip));
cout << "Connected with " << client_ip << endl;
char buffer[1024];
while(true) {
memset(buffer, 0, sizeof(buffer));
recv(newsockfd, buffer, sizeof(buffer), 0);
if(strlen(buffer) > 0) {
cout << "Client: " << buffer << endl;
}
if(strcmp(buffer, "exit") == 0) {
break;
}
cout << "Enter message: ";
cin.getline(buffer, 1024);
if(strlen(buffer) == 0) {
continue;
}
send(newsockfd, buffer, strlen(buffer), 0);
}
close(newsockfd);
close(sockfd);
return 0;
}
客户端代码:client.cpp
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
using namespace std;
int main(int argc, char *argv[]) {
if(argc != 3) {
cerr << "Usage: ./client <server-ip> <port>" << endl;
return -1;
}
int sockfd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
if(sockfd == -1) {
cerr << "Failed to create socket!" << endl;
return -1;
}
struct addrinfo hints;
struct addrinfo *res;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET6;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
int ret = getaddrinfo(argv[1], argv[2], &hints, &res);
if(ret != 0) {
cerr << "getaddrinfo failed: " << gai_strerror(ret) << endl;
return -1;
}
if(connect(sockfd, res->ai_addr, res->ai_addrlen) == -1) {
cerr << "Failed to connect!" << endl;
return -1;
}
cout << "Connected!" << endl;
char buffer[1024];
while(true) {
cout << "Enter message: ";
cin.getline(buffer, 1024);
if(strlen(buffer) == 0) {
continue;
}
send(sockfd, buffer, strlen(buffer), 0);
if(strcmp(buffer, "exit") == 0) {
break;
}
memset(buffer, 0, sizeof(buffer));
recv(sockfd, buffer, sizeof(buffer), 0);
if(strlen(buffer) > 0) {
cout << "Server: " << buffer << endl;
}
}
close(sockfd);
return 0;
}
g++编译出两个可执行文件之后
g++ -g -o server server.cpp
g++ -g -o client client.cpp
客户端执行./server 7777
服务端执行./client fe80:0:0:0:20c:29ff:fe17:d208%ens33 7777
查看服务端是否监听端口
netstat -anp | grep 7777
服务端截图
客户端截图