//
// File: client.h
// Author: root
//
// Created on February 19, 2008, 9:36 AM
//
#ifndef _CLIENT_H
#define _CLIENT_H
#include <sys/socket.h>
#include <sys/errno.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
class client{
public:
enum {BUFFERSIZE = 1024};
client(int fd,struct sockaddr_in sinaddr,int timeout);
~client();
bool update();
string _value;
private:
int _fd;
int _timeout;
char *buffer;
};
#endif /* _CLIENT_H */
#include "client.h"
client::client(int fd, sockaddr_in sinaddr, int timeout){
_fd = fd;
_timeout = timeout;
fcntl( _fd, F_SETFL, fcntl( _fd, F_GETFL ) | O_NONBLOCK );
buffer = NULL;
buffer = new char[BUFFERSIZE];
}
client::~client(){
close(_fd);
delete buffer;
buffer = NULL;
}
bool client::update(){
fd_set fdClient;
FD_ZERO( &fdClient );
FD_SET( _fd, &fdClient );
struct timeval tv;
tv.tv_sec = _timeout;
tv.tv_usec = 0;
if( select( _fd + 1, &fdClient, NULL, NULL, &tv ) == -1 ) {
return true;
}
if( FD_ISSET( _fd, &fdClient ) ) {
memset( buffer, 0, sizeof( char ) * BUFFERSIZE );
int c = recv( _fd, buffer, BUFFERSIZE, 0 );
if( c == -1 && errno != EWOULDBLOCK ) {
if( errno != ECONNRESET )
cout << "peer reset the connection" << endl;
return true;
}
else if( c == 0 )
return true;
else if( c > 0 ) {
_value = string( buffer, c );
cout << _value << endl;
}
else {
return true;
}
}
return false;
}
//
// File: server.h
// Author: root
//
// Created on February 19, 2008, 9:34 AM
//
#ifndef _SERVER_H
#define _SERVER_H
#include <vector>
#include <iostream>
#include <string>
#include "client.h"
using namespace std;
class server{
public:
server(int port);
~server();
bool update(bool block);
vector<client *> clients;
enum {MAXCLIENTS = 11};
void kill(){
_kill = true;
}
private:
int _fd;
bool _kill;
};
#endif /* _SERVER_H */
#include "server.h"
server::server(int port = 10000){
_kill = false;
struct sockaddr_in sin;
memset( &sin, 0, sizeof( sin ) );
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(port);
_fd = socket( PF_INET, SOCK_STREAM, 0 );
int optval = 1;
setsockopt( _fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval, sizeof( int ) );
if( bind( _fd, (struct sockaddr *)&sin, sizeof( sin ) ) == -1 ) {
cout << "bind error" << endl;
}
// listen, queue length 8
if( listen( _fd, 8 ) == -1 ) {
cout << "listen error" << endl;
//exit( 1 );
}
}
server::~server(){
close(_fd);
for( vector<client *> :: iterator i = clients.begin( ); i != clients.end( ); i++ )
delete *i;
clients.clear( );
}
bool server::update(bool block){
if( clients.size( ) < MAXCLIENTS ) {
fd_set fdServer;
FD_ZERO( &fdServer );
FD_SET( _fd, &fdServer );
struct timeval tv;
if( block ) {
// block for 100 ms to keep from eating up all cpu time
tv.tv_sec = 0;
tv.tv_usec = 100000;
}
else {
tv.tv_sec = 0;
tv.tv_usec = 0;
}
if( select( _fd + 1, &fdServer, NULL, NULL, &tv ) == -1 )
{
FD_ZERO( &fdServer );
usleep( 100 );
}
if( FD_ISSET( _fd, &fdServer ) ) {
struct sockaddr_in adrFrom;
int iAddrLen = sizeof( adrFrom );
int sckClient;
if( ( sckClient = accept( _fd, (struct sockaddr *)&adrFrom, (socklen_t *)&iAddrLen ) ) == -1 )
cout << "accept error" << endl;
else{
clients.push_back( new client( sckClient, adrFrom, 0) );
cout << "clients comes" << endl;
}
}
}
else {
// maximum connections reached
usleep( 100 );
}
// process
for( vector<client *> :: iterator i = clients.begin( ); i != clients.end( ); ) {
if( (*i)->update( ) ) {
delete *i;
i = clients.erase( i );
cout << "clients exit" << endl;
}
else
i++;
}
return _kill;
}
分享到:
相关推荐
本资源“C# socket封装类和组件含例程全部开源”提供了一套全面且强大的C# Socket封装,旨在简化开发过程,提高代码的可读性和可维护性。以下是对这个开源项目的详细解析: 首先,Socket是TCP/IP协议族的基本组成...
本资源“C# Socket封装类和组件源码”提供了一种简化C#中Socket操作的方法,特别适合初学者进行学习和实践。 首先,让我们了解Socket的基本概念。Socket是进程间通信(IPC)的一种方式,特别是在网络环境下。它允许...
开源项目"SimpleSocket"提供了一个简洁易用的Socket封装类,为开发者提供了更便捷的方式来处理网络通信。本文将深入解析这个开源库,探讨其设计理念、主要功能以及如何在实际开发中应用。 首先,让我们理解什么是...
这份压缩包文件中的"Socket封装类"可能包含了对这两种基础Socket类的高级封装,旨在提高代码的可复用性和易用性。 首先,我们来看`Socket`封装。Socket对象代表了两端之间的网络连接,它包含了输入和输出流,使得...
总结,"vc socket封装类通讯,服务器和客户端源程序"这个主题主要涉及到的是使用CAsyncSocket在VC++环境中实现网络通信的基本步骤和方法。通过理解并实践这些知识点,开发者可以构建出稳定、高效的网络应用,支持多...
本项目中,作者为了简化套接字编程,创建了名为"CServer"和"CClient"的封装类,以及一个用于处理流式套接字数据传输的数据包类。这些类的设计和实现包含了多个关键知识点,以下将逐一详细解释。 1. **套接字基础**...
使用vc,对socket进行了类封装,同时采用多线程处理的方式。对于初学者和使用者有很好的借鉴价值。
本实例提供了在Linux环境下实现C++自定义封装socket操作业务类的详细过程,允许开发者轻松地创建socket连接、设置参数以及发送请求。 首先,`SocketConnector` 类是核心业务类,它包含了与socket相关的各种操作。类...
经过封装的socket类,内附简单的pop3和http协议的简单应用源码
本篇文章将详细讲解C#中Socket客户端和服务端的封装,以及如何利用队列处理和实际应用示例。 一、Socket基本概念 Socket,又称为套接字,是操作系统为应用程序提供的网络编程接口。它允许两个运行在网络中的程序...
在.NET框架中,C#语言提供了丰富的库支持网络通信,其中Socket类是核心部分,用于实现TCP/IP协议栈中的各种网络通信。本示例“c# socket demo 已经封装成共通”聚焦于C#中如何使用Socket进行TCP通信,并且已经封装...
在描述中提到,这个封装类包含了文档和例子程序。文档通常会详细解释设计思路、接口使用方法以及实现细节,帮助开发者理解和使用。例子程序则直观地展示了如何在实际项目中应用这些概念,通过实践加深理解。 在...
A simple application using IO Completion Ports and WinSock。老外写的IOCP封装类,使用了线程池和内存池。很不错的东西.资源里面有文档和例子程序
创建一个C#的Socket连接封装类,我们首先定义一个类,如`SocketHelper`,并添加必要的属性和方法。这些可能包括: 1. **构造函数**:初始化Socket对象,设置其协议类型(如TCP或UDP)和地址族(如InterNetwork,...
delphi socket udp 封装类 很好用的。
Socket API封装类是一种在编程中实现网络通信的重要技术,它主要应用于不使用MFC(Microsoft Foundation Classes)框架的场景。MFC是微软提供的一种C++库,用于简化Windows应用程序的开发,但并不是所有开发者都会...
在封装类中,可能会有一个`send()`方法处理TCP和UDP的差异,比如TCP的`send()`直接使用已连接的socket,而UDP的`send()`需要提供目标地址信息。 对于TCP,`connect()`方法用于建立连接,而在UDP中没有类似的概念,...
在提供的压缩包文件中,"socket封装类"可能包含了一个或多个Java类,这些类对Socket和ServerSocket的功能进行了抽象和封装,以便于开发者在实际项目中更方便地使用。常见的封装可能包括以下几点: 1. **异常处理**...
"C# 同步Socket TCP/UDP 封装类"涉及到的关键知识点主要包括Socket的使用、TCP和UDP协议的理解、同步Socket编程模式以及如何设计和实现封装类。这些知识点对于开发网络应用至关重要,理解并掌握它们可以帮助开发者...
Socket编程在IT行业中是网络通信的基础,特别是在Windows Forms(Winform)应用开发中,它提供了一种高效且灵活的方式来进行客户端-服务器间的交互。本文将深入探讨“Socket简单通信winform”的实现,以及如何实现...