server.cpp
#include <iostream>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
using namespace std;
#define LISTEN_PORT 8888
#define BACKLOG 10
/*
socket: int socket(int domain, int type, int protocol);
bind : int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
listen: int listen(int sockfd, int backlog);
accept: int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
send : ssize_t send(int sockfd, const void *buf, size_t len, int flags);
recv : ssize_t recv(int sockfd, void *buf, size_t len, int flags);
*/
int main(int argc,char* argv[])
{
int Server_fd;
int Client_fd;
int ret;
int Addrlen;
unsigned char RecBuff[1000];
int RevData_len;
int clientnum = -1;
struct sockaddr_in Server_sockaddr_in;
struct sockaddr_in Client_sockaddr_in;
Server_sockaddr_in.sin_family = AF_INET;
Server_sockaddr_in.sin_port = htons(LISTEN_PORT); //host to net
Server_sockaddr_in.sin_addr.s_addr = INADDR_ANY;
memset(Server_sockaddr_in.sin_zero,0,8);
Server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == Server_fd)
{
cout << "Create the server socket failed!\n";
return -1;
}
ret = bind(Server_fd, (const struct sockaddr*)&Server_sockaddr_in,sizeof(struct sockaddr_in));
if (-1 == ret)
{
cout << "bind error !\n";
return -1 ;
}
ret = listen(Server_fd, BACKLOG);
if (-1 == ret)
{
cout << "listen error !\n";
return -1 ;
}
while(1)
{
Addrlen = sizeof(sockaddr_in);
Client_fd = accept(Server_fd, (struct sockaddr *)&Client_sockaddr_in,(socklen_t*)&Addrlen);
clientnum++;
if(-1 != Client_fd)
{
cout <<"get a connect successfully!\n";
cout <<"The client nummber is: "<<clientnum;
cout <<"; client IP is :" << inet_ntoa(Client_sockaddr_in.sin_addr);
cout <<endl;
}
if(0 == fork())
{
while(1)
{
RevData_len = recv(Client_fd,RecBuff,999,0);
if(0 >= RevData_len)
{
cout << "Receive data failed !\n";
close(Client_fd);
return -1;
}
else
{
cout << "Receive data from client " << clientnum ;
cout << " IP :" << inet_ntoa(Client_sockaddr_in.sin_addr)<<"successfully\n";
cout << "The meseage is :"<<RecBuff <<endl;
}
}
}
}
close(Server_fd);
close(Client_fd);
return 0;
}
client.cpp
#include <iostream>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
using namespace std;
#define LISTEN_PORT 8888
/*
socket: int socket(int domain, int type, int protocol);
bind : int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
listen: int listen(int sockfd, int backlog);
send : ssize_t send(int sockfd, const void *buf, size_t len, int flags);
recv : ssize_t recv(int sockfd, void *buf, size_t len, int flags);
coonnect :int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
*/
int main(int argc,char* argv[])
{
if(argc != 2)
{
cout << "Usage : " << argv[0] << "Server IP \n";
return -1;
}
int Client_fd;
int ret;
int Addrlen;
char SendBuff[1000];
struct sockaddr_in Server_sockaddr_in;
struct sockaddr_in Client_sockaddr_in;
Server_sockaddr_in.sin_family = AF_INET;
Server_sockaddr_in.sin_port = htons(LISTEN_PORT); //host to net
memset(Server_sockaddr_in.sin_zero,0,8);
ret = inet_aton(argv[1],&Server_sockaddr_in.sin_addr);
if (0 == ret)
{
cout << "Invalid server IP\n";
return -1 ;
}
Client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == Client_fd)
{
cout << "Create the client socket failed!\n";
return -1;
}
ret = connect(Client_fd, (const struct sockaddr *)&Server_sockaddr_in,sizeof(struct sockaddr_in));
if(-1 == ret)
{
cout << "Connect to server failed!\n";
close(Client_fd);
return -1;
}
while(1)
{
cout << "Please input :";
fgets(SendBuff,999,stdin);
send(Client_fd,SendBuff,strlen(SendBuff),0);
}
return 0;
}
运行结果:

(有空再补充注释分析)
本文提供了一个使用C++进行网络编程的详细示例,包括服务器端和客户端代码。通过socket编程实现TCP连接,演示了如何创建服务器监听特定端口,接收并处理来自客户端的数据,同时客户端能够连接到服务器并发送消息。
524

被折叠的 条评论
为什么被折叠?



