socket 编程入门教程(一)TCP server 端:8、本章的完整源代码
2013-09-22 17:00
746 查看
//Filename: TcpServerClass.hpp
#ifndef TCPSERVERCLASS_HPP_INCLUDED
#define TCPSERVERCLASS_HPP_INCLUDED
#include <unistd.h>
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
class TcpServer
{
private:
int listenSock;
int communicationSock;
sockaddr_in servAddr;
sockaddr_in clntAddr;
public:
TcpServer(int listen_port);
bool isAccept();
void handleEcho();
};
#endif // TCPSERVERCLASS_HPP_INCLUDED
//Filename: TcpServerClass.cpp
#include "TcpServerClass.hpp"
TcpServer::TcpServer(int listen_port)
{
if ( (listenSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ) {
throw "socket() failed";
}
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(listen_port);
if ( bind(listenSock, (sockaddr*)&servAddr, sizeof(servAddr)) < 0 ) {
throw "bind() failed";
}
if ( listen(listenSock, 10) < 0 ) {
throw "listen() failed";
}
}
bool TcpServer::isAccept()
{
unsigned int clntAddrLen = sizeof(clntAddr);
if ( (communicationSock = accept(listenSock, (sockaddr*)&clntAddr, &clntAddrLen)) < 0 ) {
return false;
} else {
std::cout << "Client(IP: " << inet_ntoa(clntAddr.sin_addr) << ") connected.\n";
return true;
}
}
void TcpServer::handleEcho()
{
const int BUFFERSIZE = 32;
char buffer[BUFFERSIZE];
int recvMsgSize;
bool goon = true;
while ( goon == true ) {
if ( (recvMsgSize = recv(communicationSock, buffer, BUFFERSIZE, 0)) < 0 ) {
throw "recv() failed";
} else if ( recvMsgSize == 0 ) {
goon = false;
} else {
if ( send(communicationSock, buffer, recvMsgSize, 0) != recvMsgSize ) {
throw "send() failed";
}
}
}
close(communicationSock);
}
演示程序:
//Filename: main.cpp
//Tcp Server C++ style, single work
#include <iostream>
#include "TcpServerClass.hpp"
int echo_server(int argc, char* argv[]);
int main(int argc, char* argv[])
{
int mainRtn = 0;
try {
mainRtn = echo_server(argc, argv);
}
catch ( const char* s ) {
perror(s);
exit(EXIT_FAILURE);
}
return mainRtn;
}
int echo_server(int argc, char* argv[])
{
int port;
if ( argc == 2 ) {
port = atoi(argv[1]);
} else {
port = 5000;
}
TcpServer myServ(port);
while ( true ) {
if ( myServ.isAccept() == true ) {
myServ.handleEcho();
}
}
return 0;
}
#ifndef TCPSERVERCLASS_HPP_INCLUDED
#define TCPSERVERCLASS_HPP_INCLUDED
#include <unistd.h>
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
class TcpServer
{
private:
int listenSock;
int communicationSock;
sockaddr_in servAddr;
sockaddr_in clntAddr;
public:
TcpServer(int listen_port);
bool isAccept();
void handleEcho();
};
#endif // TCPSERVERCLASS_HPP_INCLUDED
//Filename: TcpServerClass.cpp
#include "TcpServerClass.hpp"
TcpServer::TcpServer(int listen_port)
{
if ( (listenSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ) {
throw "socket() failed";
}
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(listen_port);
if ( bind(listenSock, (sockaddr*)&servAddr, sizeof(servAddr)) < 0 ) {
throw "bind() failed";
}
if ( listen(listenSock, 10) < 0 ) {
throw "listen() failed";
}
}
bool TcpServer::isAccept()
{
unsigned int clntAddrLen = sizeof(clntAddr);
if ( (communicationSock = accept(listenSock, (sockaddr*)&clntAddr, &clntAddrLen)) < 0 ) {
return false;
} else {
std::cout << "Client(IP: " << inet_ntoa(clntAddr.sin_addr) << ") connected.\n";
return true;
}
}
void TcpServer::handleEcho()
{
const int BUFFERSIZE = 32;
char buffer[BUFFERSIZE];
int recvMsgSize;
bool goon = true;
while ( goon == true ) {
if ( (recvMsgSize = recv(communicationSock, buffer, BUFFERSIZE, 0)) < 0 ) {
throw "recv() failed";
} else if ( recvMsgSize == 0 ) {
goon = false;
} else {
if ( send(communicationSock, buffer, recvMsgSize, 0) != recvMsgSize ) {
throw "send() failed";
}
}
}
close(communicationSock);
}
演示程序:
//Filename: main.cpp
//Tcp Server C++ style, single work
#include <iostream>
#include "TcpServerClass.hpp"
int echo_server(int argc, char* argv[]);
int main(int argc, char* argv[])
{
int mainRtn = 0;
try {
mainRtn = echo_server(argc, argv);
}
catch ( const char* s ) {
perror(s);
exit(EXIT_FAILURE);
}
return mainRtn;
}
int echo_server(int argc, char* argv[])
{
int port;
if ( argc == 2 ) {
port = atoi(argv[1]);
} else {
port = 5000;
}
TcpServer myServ(port);
while ( true ) {
if ( myServ.isAccept() == true ) {
myServ.handleEcho();
}
}
return 0;
}
相关文章推荐
- socket 编程入门教程(一)TCP server 端:8、本章的完整源代码
- socket 编程入门教程(一)TCP server 端:8、本章的完整源代码
- socket 编程入门教程(一)TCP server 端:5、创建监听嵌套字
- socket 编程入门教程(一)TCP server 端:3、sockaddr与sockaddr_in
- socket 编程入门教程(一)TCP server 端:5、创建监听嵌套字
- socket 编程入门教程(一)TCP server 端:6、创建“通讯 ”嵌套字
- socket 编程入门教程(一)TCP server 端:6、创建“通讯 ”嵌套字
- socket 编程入门教程(一)TCP server 端:7、接收与发送
- socket 编程入门教程(一)TCP server 端:7、接收与发送
- socket 编程入门教程(一)TCP server 端:1、建模
- socket 编程入门教程(一)TCP server 端:2、socket与文件描述符
- socket 编程入门教程(一)TCP server 端:4、构造函数涉及的概念
- socket 编程入门教程(一)TCP server 端:5、创建监听嵌套字
- socket 编程入门教程(一)TCP server 端:3、sockaddr与sockaddr_in
- socket 编程入门教程(一)TCP server 端:1、建模
- socket 编程入门教程(一)TCP server 端:6、创建“通讯 ”嵌套字
- TCP/UDP网络编程入门教程之二:TCP Server端——socket与文件描述符
- socket 编程入门教程(一)TCP server 端:1、建模
- socket 编程入门教程(一)TCP server 端:2、socket与文件描述符
- socket 编程入门教程(一)TCP server 端:2、socket与文件描述符