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

doing5552

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

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

公告

常用鏈接

留言簿(24)

我參與的團隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 456373
  • 排名 - 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 閱讀(975) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美三级在线| 久久亚洲精品一区二区| 亚洲精品一区在线| 欧美国产日韩一区二区三区| 亚洲人成免费| 日韩视频国产视频| 欧美日韩午夜在线| 欧美一区国产一区| 久久gogo国模裸体人体| 狠狠综合久久av一区二区老牛| 欧美α欧美αv大片| 蜜臀久久久99精品久久久久久 | 亚洲一区二区三区在线视频| 欧美午夜免费影院| 久久男人av资源网站| 老司机一区二区三区| 日韩视频在线观看免费| 国产精品99久久久久久白浆小说 | 巨乳诱惑日韩免费av| 一道本一区二区| 午夜在线一区| 亚洲精品久久视频| 亚洲砖区区免费| 亚洲二区在线| 亚洲永久精品大片| 在线成人av.com| 99精品国产高清一区二区| 国产欧美一区二区三区在线看蜜臀| 久久久蜜桃一区二区人| 欧美日本乱大交xxxxx| 欧美诱惑福利视频| 欧美精品色综合| 久久久久在线| 国产精品久久久久久久久久免费看 | 麻豆久久久9性大片| 亚洲宅男天堂在线观看无病毒| 久久精品视频亚洲| 亚洲午夜精品视频| 久久在精品线影院精品国产| 亚洲午夜在线视频| 另类亚洲自拍| 欧美在线一级视频| 欧美日韩国内自拍| 欧美成人一区二区三区| 国产精品亚洲片夜色在线| 亚洲高清在线观看一区| 国产精品一级久久久| 亚洲国产天堂久久综合| 国产一区二区三区在线观看免费| 亚洲人成小说网站色在线| 一区二区在线观看视频| 亚洲影院污污.| 亚洲午夜高清视频| 欧美激情久久久久| 欧美韩日一区二区| 一色屋精品视频在线观看网站| 中文亚洲欧美| 中文亚洲免费| 欧美精品在线一区二区| 欧美二区在线| 亚洲福利视频一区| 久久久无码精品亚洲日韩按摩| 欧美一区二区三区四区在线观看地址 | 国产精品美女久久久| 亚洲黄色一区| 亚洲国产精品va在线看黑人 | 欧美一级免费视频| 香蕉久久国产| 国产精品夜夜夜| 亚洲在线黄色| 欧美在线免费| 国产一区二区精品在线观看| 亚洲欧美在线磁力| 久久精品av麻豆的观看方式| 国产精品亚洲片夜色在线| 亚洲女人天堂av| 欧美一区二区视频在线观看2020 | 欧美日韩999| 一本一本久久| 欧美亚洲尤物久久| 国产一区二区三区四区在线观看| 欧美在线播放高清精品| 美女啪啪无遮挡免费久久网站| 黄色成人片子| 欧美成人精品福利| 亚洲精品美女91| 亚洲影院一区| 国产午夜精品一区二区三区视频| 久久精品道一区二区三区| 久久全球大尺度高清视频| 亚洲第一福利社区| 欧美日韩精品欧美日韩精品| 中文亚洲视频在线| 久久先锋影音| 一本久道久久久| 国产精品欧美日韩| 久久视频这里只有精品| 亚洲国产美国国产综合一区二区| 在线视频日韩精品| 国产日韩在线一区二区三区| 久久久久久**毛片大全| 91久久一区二区| 欧美在线三级| 亚洲欧洲在线视频| 国产精品美女久久久浪潮软件| 久久高清一区| 日韩视频一区二区三区| 久久久久久网| 宅男噜噜噜66国产日韩在线观看| 国产精品综合视频| 欧美成人午夜影院| 亚洲在线不卡| 亚洲国产成人在线视频| 篠田优中文在线播放第一区| 亚洲国产91精品在线观看| 欧美婷婷在线| 老司机午夜免费精品视频| 亚洲亚洲精品在线观看| 亚洲第一精品夜夜躁人人爽| 欧美一区二区国产| 在线亚洲免费| 最新亚洲电影| 怡红院精品视频在线观看极品| 国产精品久久久999| 美女视频网站黄色亚洲| 欧美一区二区三区视频| 99视频日韩| 亚洲国产一成人久久精品| 久久久久久穴| 欧美影视一区| 亚洲欧美日韩国产一区二区| 99国产精品99久久久久久| 在线看国产一区| 国产一区在线观看视频| 国产精品激情电影| 欧美日韩亚洲在线| 欧美连裤袜在线视频| 狼狼综合久久久久综合网| 久久av一区| 久久精品国产视频| 欧美亚洲一级片| 午夜精品久久久99热福利| 亚洲一区二区三区777| 一区二区三区|亚洲午夜| 亚洲精品久久久久久久久久久久| 亚洲国产精品精华液2区45| 欧美成人精品| 欧美高清成人| 亚洲国产成人porn| 亚洲成人自拍视频| 亚洲高清电影| 欧美激情片在线观看| 亚洲国产精品高清久久久| 亚洲国产黄色片| 亚洲人成网站影音先锋播放| 亚洲日本久久| 中日韩美女免费视频网址在线观看| 99re视频这里只有精品| 一本色道久久88亚洲综合88| 在线午夜精品自拍| 欧美一级淫片aaaaaaa视频| 性色av一区二区三区| 欧美一区免费| 鲁大师成人一区二区三区| 欧美gay视频| 欧美日韩国产二区| 国产精品青草综合久久久久99| 国产日韩久久| 亚洲人成绝费网站色www| 99av国产精品欲麻豆| 国产精品99久久久久久久vr| 亚洲午夜激情| 久久久之久亚州精品露出| 欧美电影在线观看| 亚洲色图自拍| 久久嫩草精品久久久精品一| 欧美激情网站在线观看| 国产精品入口日韩视频大尺度| 韩国av一区二区三区| 亚洲精品日韩在线观看| 午夜久久资源| 女人天堂亚洲aⅴ在线观看| 亚洲精品一级| 久久超碰97中文字幕| 欧美精品久久久久久| 国产喷白浆一区二区三区| 亚洲日本电影| 久久久激情视频| 99pao成人国产永久免费视频| 香蕉亚洲视频| 欧美色另类天堂2015| 亚洲成色www8888| 欧美一区二区三区在线观看视频| 亚洲激情偷拍| 久久精品国产999大香线蕉| 欧美三区在线| 91久久精品日日躁夜夜躁欧美 | 亚洲第一精品影视| 欧美亚洲综合网| 亚洲精品久久久蜜桃|