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

doing5552

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

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

公告

常用鏈接

留言簿(24)

我參與的團隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 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)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            日韩一级欧洲| 欧美一激情一区二区三区| 免费不卡视频| 欧美中文字幕在线视频| 国产一区91| 欧美成人有码| 欧美激情性爽国产精品17p| 日韩亚洲在线观看| 一本色道久久综合亚洲91| 国产精品国产三级国产普通话99| aⅴ色国产欧美| 艳妇臀荡乳欲伦亚洲一区| 亚洲人成啪啪网站| 欧美精品导航| 亚洲欧美国产一区二区三区| 亚洲欧美福利一区二区| 欧美一级网站| 亚洲巨乳在线| 亚洲一区二区视频在线观看| 激情综合色综合久久| 亚洲福利视频三区| 国产精品h在线观看| 久久精选视频| 欧美大色视频| 久久国产精品免费一区| 开元免费观看欧美电视剧网站| 久久综合伊人77777麻豆| 在线视频欧美精品| 欧美有码视频| 这里只有精品丝袜| 久久激情视频| 午夜国产精品视频| 久久综合狠狠| 久久精品99久久香蕉国产色戒| 久久先锋影音av| 欧美日韩第一区| 久热精品在线视频| 欧美午夜在线一二页| 久久综合伊人| 国产精品久久久久国产a级| 免费av成人在线| 国产欧美一区二区白浆黑人| 亚洲东热激情| 精品不卡在线| 亚洲欧美日韩综合aⅴ视频| 一本色道久久综合狠狠躁的推荐| 久久高清免费观看| 欧美亚洲免费高清在线观看| 欧美激情一区二区久久久| 久久久精品网| 国产女人aaa级久久久级| 99re热这里只有精品免费视频| 在线不卡免费欧美| 久久国产色av| 看欧美日韩国产| 国产一区二区三区在线观看网站| 一区二区三区免费看| 一区二区三区久久| 欧美精品日韩一区| 亚洲国产精品久久久久婷婷老年| 激情丁香综合| 久久久噜噜噜久久中文字免| 久久久91精品国产一区二区精品| 国产精品视频一| 亚洲在线国产日韩欧美| 欧美一区二区大片| 国产伦精品免费视频| 在线一区观看| 欧美主播一区二区三区美女 久久精品人| 欧美日韩综合在线| 一区二区三区视频在线观看| 亚洲视频一区在线观看| 欧美午夜电影网| 中文av一区特黄| 欧美亚洲自偷自偷| 国产一区欧美| 美日韩免费视频| 亚洲国产婷婷| 亚洲综合视频网| 国产视频一区在线观看一区免费| 欧美一区二区三区另类| 国产乱码精品一区二区三区忘忧草| 在线视频精品| 欧美一二三视频| 在线高清一区| 欧美伦理a级免费电影| 一本色道久久99精品综合| 欧美日韩一区二区在线| 亚洲一卡久久| 久久免费观看视频| 亚洲乱码国产乱码精品精天堂 | 久久久久.com| 欧美国产日韩视频| 一区二区三区国产盗摄| 国产精品嫩草99av在线| 久久久久久**毛片大全| 欧美激情第二页| 亚洲欧美国产毛片在线| 激情综合亚洲| 欧美天天视频| 久久综合伊人77777麻豆| 亚洲日产国产精品| 欧美在线视频免费观看| 亚洲国产网站| 国产精品视区| 免费日韩av片| 午夜欧美不卡精品aaaaa| 欧美电影免费观看高清完整版| 正在播放欧美视频| 影音先锋中文字幕一区| 欧美色欧美亚洲另类二区| 欧美在线免费观看视频| 99精品国产在热久久| 久久久.com| 亚洲一区二区三区涩| 在线精品福利| 国产美女精品人人做人人爽| 欧美激情无毛| 久久综合99re88久久爱| 小处雏高清一区二区三区 | 久久乐国产精品| 亚洲综合大片69999| **欧美日韩vr在线| 国产亚洲观看| 欧美四级剧情无删版影片| 久久亚洲国产成人| 性色一区二区| 亚洲视频视频在线| 亚洲麻豆国产自偷在线| 欧美成人精品在线视频| 久久久久在线| 久久国产精品第一页| 亚洲影视九九影院在线观看| 亚洲精品视频免费观看| 亚洲国产你懂的| 一区福利视频| 激情综合自拍| 黄网站免费久久| 一区二区亚洲精品国产| 黄色精品网站| 精品99一区二区| 在线成人激情| 亚洲国产精彩中文乱码av在线播放| 国产欧美 在线欧美| 国产欧美日韩| 国产日韩欧美视频在线| 国产精品一区一区三区| 国产精品第一页第二页第三页| 欧美日韩999| 欧美日韩一级大片网址| 国产精品jizz在线观看美国| 欧美午夜在线视频| 国产精品日韩一区| 国产视频精品网| 国产一区日韩欧美| 尤物九九久久国产精品的特点 | 国产精品视频自拍| 国产毛片一区| 亚洲成色最大综合在线| 美女日韩欧美| 欧美日韩国产高清| 国产精品久久国产精麻豆99网站| 欧美亚一区二区| 国产精品毛片va一区二区三区 | 亚洲国产精品视频| 亚洲看片网站| 午夜精品久久久久久久久久久| 性欧美xxxx视频在线观看| 久久久久久一区二区三区| 毛片基地黄久久久久久天堂| 欧美伦理91| 国产精品盗摄一区二区三区| 国产日韩精品一区二区三区| 激情自拍一区| 宅男精品导航| 久久人91精品久久久久久不卡 | 亚洲特色特黄| 久久免费视频网| 亚洲精品一区中文| 亚洲欧美另类国产| 免费观看在线综合色| 欧美午夜不卡视频| 欧美亚洲一区三区| 欧美激情按摩| 国产欧美三级| 日韩一区二区久久| 欧美专区亚洲专区| 亚洲精品久久久一区二区三区| 亚洲免费中文字幕| 麻豆视频一区二区| 国产婷婷色一区二区三区四区| 亚洲国产合集| 欧美在线影院| aⅴ色国产欧美| 狼人天天伊人久久| 亚洲女爱视频在线| 欧美激情第五页| 亚洲国产精品久久久久秋霞不卡 | 亚洲一区综合| 亚洲国产精品久久久久秋霞不卡 |