青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

doing5552

記錄每日點滴,不枉人生一世

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  73 Posts :: 0 Stories :: 94 Comments :: 0 Trackbacks

公告

常用鏈接

留言簿(24)

我參與的團隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 455899
  • 排名 - 49

最新隨筆

最新評論

閱讀排行榜

評論排行榜

Here, I present the source code for a socket class that faciliates using Sockets in Windows Programming. I also want to say thanks Fabien Le Lez, www.infflux.com and Tamas Kaskoto who have improved this source.
This socket class is being used for BROADCAST chat client.
These are actually four classes: Socket (the base class) from which SocketServer and SocketClient are derived. Also, there is SocketSelect which can be used to do a Select call on more than one Socket. The constructors of Socket are protected; this should be a taken as a hint not to use Socket, but either SocketServer or SocketClient.
When you compile this files, make sure you link them against Ws2_32.lib.
Jump to the header file, the implementation file, the test programm and the Echo Server. Here's also a Proxy and a Web Server.
You can also download the files.
A small description of the socket class: Every program that uses Windows Sockets needs to call WSAStartup. This call is wrapped into Socket::Start, which in turn is called by the Socket's constructor. I pass 2.0 as version here as I expect that version to be installed.
The Socket's constructor also calls socket() (note the small s) which actually creates the socket. It passes the SOCK_STREAM parameter, indicating TCP. If UDP were wished, you'd have to pass SOCK_DGRAM.
SocketClient: SocketClient is inherited from Socket.
The constructor of SocketClient takes a host as parameter, which is the name of the server that this client wishes to communicate to. This name is resolved into an IP Address by gethostbyname().
SocketServer: SocketServer is inherited from Socket.
The constructor of the SocketServer class listens on the port indicated in its parameter. This is made by calling bind().
As SOCK_STREAM type sockets have the ability to queue incoming connection requests, we need to know the maximum number of connections to be queued which can be stated by the connections parameter (and which is passed to listen()).
SocketServer::Accept(): simply waits for an incoming connection request (or removes one from the queue) by calling accept (note the small a).
socket.h
/*
Socket.h
Copyright (C) 2002-2004 René Nyffenegger
This source code is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this source code must not be misrepresented; you must not
claim that you wrote the original source code. If you use this source code
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original source code.
3. This notice may not be removed or altered from any source distribution.
René Nyffenegger rene.nyffenegger@adp-gmbh.ch
*/
#ifndef SOCKET_H
#define SOCKET_H
#include <WinSock2.h>
#include <string>
enum TypeSocket {BlockingSocket, NonBlockingSocket};
class Socket {
public:
virtual ~Socket();
Socket(const Socket&);
Socket& operator=(Socket&);
std::string ReceiveLine();
std::string ReceiveBytes();
void   Close();
// The parameter of SendLine is not a const reference
// because SendLine modifes the std::string passed.
void   SendLine (std::string);
// The parameter of SendBytes is a const reference
// because SendBytes does not modify the std::string passed
// (in contrast to SendLine).
void   SendBytes(const std::string&);
protected:
friend class SocketServer;
friend class SocketSelect;
Socket(SOCKET s);
Socket();
SOCKET s_;
int* refCounter_;
private:
static void Start();
static void End();
static int  nofSockets_;
};
class SocketClient : public Socket {
public:
SocketClient(const std::string& host, int port);
};
class SocketServer : public Socket {
public:
SocketServer(int port, int connections, TypeSocket type=BlockingSocket);
Socket* Accept();
};
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/wsapiref_2tiq.asp
class SocketSelect {
public:
SocketSelect(Socket const * const s1, Socket const * const s2=NULL, TypeSocket type=BlockingSocket);
bool Readable(Socket const * const s);
private:
fd_set fds_;
};
#endif

The implementation file

socket.cpp
/*
Socket.cpp
Copyright (C) 2002-2004 René Nyffenegger
This source code is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this source code must not be misrepresented; you must not
claim that you wrote the original source code. If you use this source code
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original source code.
3. This notice may not be removed or altered from any source distribution.
René Nyffenegger rene.nyffenegger@adp-gmbh.ch
*/
#include "Socket.h"
#include <iostream>
using namespace std;
int Socket::nofSockets_= 0;
void Socket::Start() {
if (!nofSockets_) {
WSADATA info;
if (WSAStartup(MAKEWORD(2,0), &info)) {
throw "Could not start WSA";
}
}
++nofSockets_;
}
void Socket::End() {
WSACleanup();
}
Socket::Socket() : s_(0) {
Start();
// UDP: use SOCK_DGRAM instead of SOCK_STREAM
s_ = socket(AF_INET,SOCK_STREAM,0);
if (s_ == INVALID_SOCKET) {
throw "INVALID_SOCKET";
}
refCounter_ = new int(1);
}
Socket::Socket(SOCKET s) : s_(s) {
Start();
refCounter_ = new int(1);
};
Socket::~Socket() {
if (! --(*refCounter_)) {
Close();
delete refCounter_;
}
--nofSockets_;
if (!nofSockets_) End();
}
Socket::Socket(const Socket& o) {
refCounter_=o.refCounter_;
(*refCounter_)++;
s_         =o.s_;
nofSockets_++;
}
Socket& Socket::operator=(Socket& o) {
(*o.refCounter_)++;
refCounter_=o.refCounter_;
s_         =o.s_;
nofSockets_++;
return *this;
}
void Socket::Close() {
closesocket(s_);
}
std::string Socket::ReceiveBytes() {
std::string ret;
char buf[1024];
while (1) {
u_long arg = 0;
if (ioctlsocket(s_, FIONREAD, &arg) != 0)
break;
if (arg == 0)
break;
if (arg > 1024) arg = 1024;
int rv = recv (s_, buf, arg, 0);
if (rv <= 0) break;
std::string t;
t.assign (buf, rv);
ret += t;
}
return ret;
}
std::string Socket::ReceiveLine() {
std::string ret;
while (1) {
char r;
switch(recv(s_, &r, 1, 0)) {
case 0: // not connected anymore;
// ... but last line sent
// might not end in \n,
// so return ret anyway.
return ret;
case -1:
return "";
//      if (errno == EAGAIN) {
//        return ret;
//      } else {
//      // not connected anymore
//      return "";
//      }
}
ret += r;
if (r == '\n')  return ret;
}
}
void Socket::SendLine(std::string s) {
s += '\n';
send(s_,s.c_str(),s.length(),0);
}
void Socket::SendBytes(const std::string& s) {
send(s_,s.c_str(),s.length(),0);
}
SocketServer::SocketServer(int port, int connections, TypeSocket type) {
sockaddr_in sa;
memset(&sa, 0, sizeof(sa));
sa.sin_family = PF_INET;
sa.sin_port = htons(port);
s_ = socket(AF_INET, SOCK_STREAM, 0);
if (s_ == INVALID_SOCKET) {
throw "INVALID_SOCKET";
}
if(type==NonBlockingSocket) {
u_long arg = 1;
ioctlsocket(s_, FIONBIO, &arg);
}
/* bind the socket to the internet address */
if (bind(s_, (sockaddr *)&sa, sizeof(sockaddr_in)) == SOCKET_ERROR) {
closesocket(s_);
throw "INVALID_SOCKET";
}
listen(s_, connections);
}
Socket* SocketServer::Accept() {
SOCKET new_sock = accept(s_, 0, 0);
if (new_sock == INVALID_SOCKET) {
int rc = WSAGetLastError();
if(rc==WSAEWOULDBLOCK) {
return 0; // non-blocking call, no request pending
}
else {
throw "Invalid Socket";
}
}
Socket* r = new Socket(new_sock);
return r;
}
SocketClient::SocketClient(const std::string& host, int port) : Socket() {
std::string error;
hostent *he;
if ((he = gethostbyname(host.c_str())) == 0) {
error = strerror(errno);
throw error;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr = *((in_addr *)he->h_addr);
memset(&(addr.sin_zero), 0, 8);
if (::connect(s_, (sockaddr *) &addr, sizeof(sockaddr))) {
error = strerror(WSAGetLastError());
throw error;
}
}
SocketSelect::SocketSelect(Socket const * const s1, Socket const * const s2, TypeSocket type) {
FD_ZERO(&fds_);
FD_SET(const_cast<Socket*>(s1)->s_,&fds_);
if(s2) {
FD_SET(const_cast<Socket*>(s2)->s_,&fds_);
}
TIMEVAL tval;
tval.tv_sec  = 0;
tval.tv_usec = 1;
TIMEVAL *ptval;
if(type==NonBlockingSocket) {
ptval = &tval;
}
else {
ptval = 0;
}
if (select (0, &fds_, (fd_set*) 0, (fd_set*) 0, ptval) == SOCKET_ERROR)
throw "Error in select";
}
bool SocketSelect::Readable(Socket const* const s) {
if (FD_ISSET(s->s_,&fds_)) return true;
return false;
}

A simple Client

The following simple client connects to www.google.ch and get its front-website.
#include "Socket.h"
#include <iostream>
using namespace std;
int main() {
try {
SocketClient s("www.google.com", 80);
s.SendLine("GET / HTTP/1.0");
s.SendLine("Host: www.google.com");
s.SendLine("");
while (1) {
string l = s.ReceiveLine();
if (l.empty()) break;
cout << l;
cout.flush();
}
}
catch (const char* s) {
cerr << s << endl;
}
catch (std::string s) {
cerr << s << endl;
}
catch (...) {
cerr << "unhandled exception\n";
}
return 0;
}

A simple echo Server

The following simple Server opens a port on 2000 and waits for incoming connections. Each connection is answered with the same line as was written (echoed).
If you want to test the server, use telnet localhost 2000
/*
EchoServer.cpp
Copyright (C) 2002-2004 René Nyffenegger
This source code is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this source code must not be misrepresented; you must not
claim that you wrote the original source code. If you use this source code
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original source code.
3. This notice may not be removed or altered from any source distribution.
René Nyffenegger rene.nyffenegger@adp-gmbh.ch
*/
#include "Socket.h"
#include <process.h>
#include <string>
unsigned __stdcall Answer(void* a) {
Socket* s = (Socket*) a;
while (1) {
std::string r = s->ReceiveLine();
if (r.empty()) break;
s->SendLine(r);
}
delete s;
return 0;
}
int main(int argc, char* argv[]) {
SocketServer in(2000,5);
while (1) {
Socket* s=in.Accept();
unsigned ret;
_beginthreadex(0,0,Answer,(void*) s,0,&ret);
}
return 0;
}

A Proxy that uses the Socket class

You need the Chameleon class to compile this proxy.
Usage: proxy <port proxy> <addr server> <port server>.
This proxy will then listen on <port proxy> and whenever it receives a connection, relays the traffic to the <port server> of <addr server>. This makes it ideal to see what an SMTP Client exchanges with a SMTP Server, or equally what a NNTP client exchanges with an NNTP Server.
Proxy.cpp
/*
Proxy.cpp
Copyright (C) 2002-2004 René Nyffenegger
This source code is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this source code must not be misrepresented; you must not
claim that you wrote the original source code. If you use this source code
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original source code.
3. This notice may not be removed or altered from any source distribution.
René Nyffenegger rene.nyffenegger@adp-gmbh.ch
*/
#include "Socket.h"
#include <iostream>
#include <process.h>
#include <sstream>
int         portProxy;
std::string addrServer;
int         portServer;
unsigned __stdcall RunProxyThread (void* a) {
Socket*      s = (Socket*) a;
SocketClient c(addrServer, portServer);
while (1) {
SocketSelect sel(s, &c);
bool still_connected = true;
if (sel.Readable(s)) {
std::string bytes = s->ReceiveBytes();
c.SendBytes(bytes);
std::cout << "Server: " << bytes << std::endl;
if (bytes.empty()) still_connected=false;
}
if (sel.Readable(&c)) {
std::string bytes = c.ReceiveBytes();
s->SendBytes(bytes);
std::cout << "Client: " << bytes << std::endl;
if (bytes.empty()) still_connected=false;
}
if (! still_connected) {
break;
}
}
delete s;
return 0;
}
int main(int argc, char* argv[]) {
if (argc < 4) {
std::cout << "Usage:" << std::endl;
std::cout << "  proxy <port proxy> <addr server> <port server>" << std::endl;
std::cout << std::endl;
std::cout << "  This proxy will then listen on <port proxy> and whenever it receives" << std::endl;
std::cout << "  a connection, relays the traffic to the <port server> of <addr server>." << std::endl;
std::cout << "  This makes it ideal to see what an SMTP Client exchanges with a SMTP Server," << std::endl;
std::cout << "  or equally what a NNTP client exchanges with an NNTP Server." << std::endl << std::endl;
return -1;
}
std::stringstream s;
s<<argv[1]; s>>portProxy; s.clear();
addrServer=argv[2];
s<<argv[3]; s>>portServer;
SocketServer in(portProxy,5);
while (1) {
Socket* s=in.Accept();
unsigned ret;
_beginthreadex(0, 0, RunProxyThread,(void*) s,0,&ret);
}
return 0;
}
See also: Fiddler: a HTTP Debugging Proxy which logs all HTTP traffic between your computer and the Internet. Fiddler allows you to watch HTTP Traffic, set breakpoints, and "fiddle" with incoming or outgoing data. Fiddler is designed to be much simpler than using NetMon or Achilles.

Message Distributor

Message Distributor is a server that listens on port 2000. Any number of clients can connect to that server. When a client sends a message to the server, the server will broadcast this message to all other clients, but not to the one that sent the message.
MsgDistributor.cpp
/*
MsgDistributor.cpp
Copyright (C) 2002-2004 René Nyffenegger
This source code is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this source code must not be misrepresented; you must not
claim that you wrote the original source code. If you use this source code
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original source code.
3. This notice may not be removed or altered from any source distribution.
René Nyffenegger rene.nyffenegger@adp-gmbh.ch
*/
#include "Socket.h"
#include <process.h>
#include <string>
#include <list>
typedef std::list<Socket*> socket_list;
socket_list g_connections;
unsigned __stdcall Connection(void* a) {
Socket* s = (Socket*) a;
g_connections.push_back(s);
s->SendLine("Welcome to the Message Distributor");
while (1) {
std::string r = s->ReceiveLine();
if (r.empty()) break;
for (socket_list::iterator os =g_connections.begin();
os!=g_connections.end();
os++) {
if (*os != s) (*os)->SendLine(r);
}
}
g_connections.remove(s);
delete s;
return 0;
}
int main() {
SocketServer in(2000,5);
while (1) {
Socket* s=in.Accept();
unsigned ret;
_beginthreadex(0,0,Connection,(void*) s,0,&ret);
}
return 0;
}

Download the files

You can download the source code and the exefiles as a zip file consisting of
  • socket.h
  • Chameleon.h
  • Chameleon.cpp
  • EchoServer.cpp
  • MsgDistributor.cpp
  • Proxy.cpp
  • Socket.cpp
  • EchoServer.exe
  • Proxy.exe
  • makefile
I was able to compile the sources with mingw using the supplied makefile.

Thanks

Thanks to Eugene Wee and Nathan Vander Wilt who helped me improve the socket class.

 

posted on 2010-01-12 20:36 doing5552 閱讀(970) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美在线综合视频| 欧美偷拍一区二区| 最新国产の精品合集bt伙计| 久久久久综合网| 久久精品系列| 免费亚洲一区二区| 亚洲电影免费观看高清| 欧美国产精品久久| 亚洲激情中文1区| 一区二区高清在线观看| 亚洲一区二区三区精品视频| 亚洲女女女同性video| 久久成人精品无人区| 久久综合久久久久88| 欧美黄在线观看| 国产精品中文字幕欧美| 亚洲电影第三页| 亚洲无吗在线| 理论片一区二区在线| 亚洲精品乱码久久久久久日本蜜臀| 99国产成+人+综合+亚洲欧美| 亚洲制服av| 欧美风情在线观看| 国产一区在线视频| 夜夜夜久久久| 欧美成人a∨高清免费观看| 一区二区三区 在线观看视频| 久久精品91| 国产精品黄色在线观看| 亚洲全部视频| 久久se精品一区精品二区| 亚洲高清久久| 久久亚洲欧美国产精品乐播| 欧美色视频日本高清在线观看| 亚洲福利在线视频| 久久精品免费观看| 亚洲视频欧美在线| 欧美美女日韩| 亚洲国产精品一区二区www在线| 亚洲欧美视频在线| 亚洲人体影院| 免费影视亚洲| 国产伊人精品| 欧美一二三区精品| 亚洲理论在线| 欧美精品电影| 亚洲精品无人区| 亚洲第一中文字幕| 另类尿喷潮videofree| 国内综合精品午夜久久资源| 香蕉久久夜色精品国产使用方法| 亚洲精品乱码久久久久久日本蜜臀| 老牛嫩草一区二区三区日本| 一区二区在线视频| 麻豆久久婷婷| 久久综合一区二区| 91久久香蕉国产日韩欧美9色| 欧美承认网站| 欧美成人69av| 99综合精品| 夜夜嗨av一区二区三区中文字幕| 免费成人av在线看| 亚洲免费成人| 日韩视频在线播放| 国产精品扒开腿爽爽爽视频| 亚洲欧美在线观看| 欧美亚洲三区| 亚洲高清不卡一区| 亚洲高清视频在线| 欧美精品久久一区| 亚洲欧美视频在线观看视频| 亚洲欧美日韩国产一区二区三区| 国产精品毛片va一区二区三区| 午夜久久电影网| 久久国产成人| 亚洲精品在线免费| 亚洲视频一区在线观看| 国产九九精品视频| 老色批av在线精品| 欧美激情影音先锋| 性欧美长视频| 久久久久免费| 一区二区三区色| 亚洲欧美日韩视频一区| 在线观看一区二区精品视频| 最新中文字幕亚洲| 国产美女搞久久| 欧美激情精品久久久| 欧美日韩一区二区视频在线观看| 久久精品免费| 欧美日韩另类综合| 久久嫩草精品久久久精品| 欧美国产一区在线| 欧美在线观看视频在线| 欧美成人午夜| 久久国产欧美精品| 欧美另类综合| 欧美福利精品| 国产女主播视频一区二区| 欧美激情一区二区三区蜜桃视频| 国产精品九九| 亚洲精品一区二| 中文一区在线| 亚洲精品乱码久久久久| 在线亚洲精品福利网址导航| 久久精品国产成人| 久久aⅴ国产欧美74aaa| 欧美三级电影一区| 日韩一二三在线视频播| 亚洲无毛电影| 国产午夜亚洲精品羞羞网站| 亚洲伦理自拍| 一区二区国产精品| 欧美精品综合| 欧美伊久线香蕉线新在线| 欧美一二三区精品| 久久国产精品99国产| 91久久精品一区二区别| 国产一二三精品| 亚洲天天影视| 欧美激情一区在线| 亚洲免费在线精品一区| av成人免费在线观看| 美女在线一区二区| 久久香蕉精品| 国产揄拍国内精品对白 | 曰本成人黄色| 亚洲欧美中文日韩v在线观看| 一区二区三区久久| 免费欧美电影| 亚洲二区在线视频| 在线免费观看日韩欧美| 久久精品一区二区三区不卡| 久久国产婷婷国产香蕉| 国产精品午夜视频| 午夜日韩激情| 狼狼综合久久久久综合网| 国产一区二区电影在线观看| 亚洲欧美中文日韩在线| 久久久激情视频| 黄色成人免费网站| 另类亚洲自拍| 亚洲欧洲精品一区二区三区 | 国产精品视频yy9299一区| 夜久久久久久| 久久av老司机精品网站导航| 国语对白精品一区二区| 免播放器亚洲| 夜夜精品视频| 久久久久久亚洲精品中文字幕| 亚洲精品免费看| 性xx色xx综合久久久xx| 男同欧美伦乱| 9久草视频在线视频精品| 欧美日本高清| 午夜国产不卡在线观看视频| 久久嫩草精品久久久精品| 91久久国产综合久久| 欧美区高清在线| 午夜精品久久久久影视| 欧美国产激情| 亚洲欧美日本另类| 在线日韩成人| 国产精品成人播放| 欧美一区午夜精品| 亚洲国产精品热久久| 新狼窝色av性久久久久久| 尤物99国产成人精品视频| 欧美激情综合五月色丁香小说| 亚洲先锋成人| 亚洲成色精品| 久久精品国产2020观看福利| 亚洲激情中文1区| 国产欧美欧美| 欧美日韩国产天堂| 久久成人精品| 亚洲小说欧美另类社区| 欧美激情1区2区3区| 午夜免费电影一区在线观看| 91久久在线播放| 国产一区二区三区高清| 欧美日韩影院| 欧美国产一区二区在线观看 | 欧美在线资源| 亚洲一区二区三区午夜| 亚洲国产精品悠悠久久琪琪| 欧美一区国产二区| 一区二区激情视频| 亚洲国产精品传媒在线观看 | 亚洲线精品一区二区三区八戒| 亚洲第一精品影视| 国产农村妇女精品一区二区| 欧美剧在线观看| 久久夜色撩人精品| 欧美制服丝袜| 性高湖久久久久久久久| 亚洲特黄一级片| 夜夜狂射影院欧美极品| 99精品欧美一区二区三区| 欧美激情精品久久久久久蜜臀 |