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

doing5552

記錄每日點(diǎn)滴,不枉人生一世

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

公告

常用鏈接

留言簿(24)

我參與的團(tuán)隊

最新隨筆

搜索

  •  

積分與排名

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

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   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>
            欧美国产日产韩国视频| 久久尤物视频| 国产欧美精品在线| 久久成人精品电影| 欧美jizz19hd性欧美| 亚洲人体一区| 欧美午夜精品久久久久久超碰| 99re热这里只有精品免费视频| 亚洲免费小视频| 欧美在线看片| 亚洲成人在线视频播放| 在线观看视频亚洲| 欧美精品在线一区| 亚洲午夜精品一区二区三区他趣| 亚洲欧美一级二级三级| 1769国产精品| 欧美日韩一本到| 欧美在线视屏| 亚洲另类在线视频| 国产主播在线一区| 欧美大片网址| 亚洲一区二区高清| 久久综合久色欧美综合狠狠 | 狠狠做深爱婷婷久久综合一区 | 在线综合亚洲| 久久精品国产久精国产一老狼| 欧美sm视频| 亚洲一区二区网站| 一区在线电影| 国产精品啊v在线| 久久综合久久综合久久综合| 在线视频免费在线观看一区二区| 久久综合给合| 亚洲欧美一区二区原创| 亚洲国产高清一区| 国产欧美一区二区精品性| 亚洲福利专区| 欧美在线999| 99热这里只有精品8| 国语自产精品视频在线看抢先版结局 | 亚洲一区二区三区国产| 欧美激情一区二区三区高清视频| 午夜亚洲精品| 欧美理论视频| 久久久精品网| 欧美一区二区三区四区在线观看 | 亚洲免费成人av电影| 国产无一区二区| 欧美视频一区二区三区| 欧美sm重口味系列视频在线观看| 亚洲专区一区| 正在播放日韩| 亚洲裸体视频| 一区二区免费在线播放| 亚洲黑丝在线| 又紧又大又爽精品一区二区| 国产日韩精品视频一区二区三区| 欧美日韩精品系列| 欧美精品亚洲| 欧美电影在线观看完整版| 老鸭窝毛片一区二区三区 | 狂野欧美激情性xxxx欧美| 亚洲欧美日韩久久精品| 亚洲欧美卡通另类91av| 亚洲色图在线视频| 日韩亚洲欧美精品| 亚洲精品四区| 99国产一区二区三精品乱码| 亚洲精品网址在线观看| 亚洲黄色免费| 亚洲激情在线观看| 亚洲国产欧美日韩精品| 亚洲成色最大综合在线| 亚洲第一在线综合网站| 亚洲动漫精品| 亚洲日韩视频| 日韩视频国产视频| 一区二区三区国产盗摄| 中文有码久久| 亚洲一区在线看| 西西裸体人体做爰大胆久久久| 午夜视频在线观看一区二区| 欧美一区二区日韩| 久久久99爱| 美女脱光内衣内裤视频久久网站| 欧美成人69av| 亚洲黄色毛片| 在线亚洲一区观看| 欧美亚洲视频在线观看| 久久狠狠久久综合桃花| 美女网站在线免费欧美精品| 欧美激情一区二区三区四区| 欧美日精品一区视频| 国产精品一区二区三区久久久 | 猛干欧美女孩| 亚洲国产精品激情在线观看| 亚洲美女在线观看| 亚洲午夜精品一区二区三区他趣| 久久国产精品久久国产精品| 久久综合色一综合色88| 欧美区视频在线观看| 国产精品一二三视频| 黄色成人片子| 一区二区免费在线视频| 欧美一区二区日韩| 欧美成人午夜视频| 日韩小视频在线观看| 午夜精品福利电影| 免费人成精品欧美精品| 欧美四级在线| 伊人成人在线视频| av成人免费在线观看| 久久九九精品99国产精品| 亚洲三级性片| 午夜视频在线观看一区| 欧美激情一区二区三区在线| 一区二区三区精密机械公司 | 噜噜噜躁狠狠躁狠狠精品视频| 欧美精品福利在线| 国产欧美精品一区二区色综合| 亚洲黄色影院| 欧美一区二区视频观看视频| 亚洲成人在线网站| 亚洲午夜视频| 欧美成人黑人xx视频免费观看| 国产精品区一区二区三区| 久久综合伊人77777| 欧美性大战久久久久久久| 在线成人性视频| 午夜一区二区三视频在线观看| 欧美成人亚洲成人| 午夜久久一区| 欧美日韩在线精品一区二区三区| 激情欧美亚洲| 欧美一区午夜视频在线观看| 亚洲片在线资源| 久久久蜜臀国产一区二区| 国产精品美女久久久久久久| 亚洲蜜桃精久久久久久久| 国产一区二区黄| 亚洲自拍偷拍福利| 亚洲精品久久久久久久久| 久久久久一区二区三区四区| 国产日韩精品综合网站| 亚洲网站在线观看| 亚洲国内高清视频| 久久三级福利| 狠狠色噜噜狠狠色综合久| 午夜在线成人av| 中文av字幕一区| 欧美日韩一区二区三区视频| 亚洲精品久久久久中文字幕欢迎你 | 亚洲欧美日韩国产综合精品二区| 亚洲激情一区| 可以免费看不卡的av网站| 黄色影院成人| 久久久亚洲午夜电影| 香蕉av福利精品导航| 国产免费一区二区三区香蕉精| 亚洲午夜国产成人av电影男同| 亚洲丰满在线| 欧美精品v日韩精品v国产精品| 亚洲激情女人| 亚洲第一精品夜夜躁人人躁| 另类图片国产| 亚洲欧洲一区二区三区久久| 欧美激情第二页| 免费人成精品欧美精品| 最新日韩在线| 91久久夜色精品国产九色| 欧美精品在线观看播放| 一区二区高清视频| 99精品99| 国产精品国产a| 欧美一级专区| 久久精彩免费视频| 亚洲高清一区二| 亚洲激情视频在线| 国产精品高潮呻吟视频| 午夜在线一区二区| 久久精品女人| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲国产另类精品专区| 欧美日韩精品免费观看视频| 亚洲午夜精品福利| 欧美亚洲免费电影| 亚洲电影下载| 日韩网站在线观看| 国产欧美日韩在线播放| 看欧美日韩国产| 欧美黄色影院| 欧美在线免费一级片| 久久久久久亚洲精品杨幂换脸| 亚洲经典三级| 9色国产精品| 国产主播在线一区| 亚洲美女av在线播放| 国产欧美韩国高清| 欧美电影电视剧在线观看| 欧美日韩亚洲一区二|