diff options
author | Tobias Weimer <wishmaster51@googlemail.com> | 2012-08-21 15:23:54 +0000 |
---|---|---|
committer | Tobias Weimer <wishmaster51@googlemail.com> | 2012-08-21 15:23:54 +0000 |
commit | 260cf26dec30e33ae3c7c6a91fccc0b4b43b8ce4 (patch) | |
tree | d2718f2979852832740f5eb1854e6e9b6d5dc7ed /plugins/!NotAdopted/Xfire/xfiretest/socket.cpp | |
parent | 3abc8a4dcba551b8a3a01fcc1b7c311dff5eaf32 (diff) |
latest XFire plugin sources by dufte (thanks)
No adaptions, uploaded as-is
git-svn-id: http://svn.miranda-ng.org/main/trunk@1514 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/!NotAdopted/Xfire/xfiretest/socket.cpp')
-rw-r--r-- | plugins/!NotAdopted/Xfire/xfiretest/socket.cpp | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/plugins/!NotAdopted/Xfire/xfiretest/socket.cpp b/plugins/!NotAdopted/Xfire/xfiretest/socket.cpp new file mode 100644 index 0000000000..d47d3c6d1b --- /dev/null +++ b/plugins/!NotAdopted/Xfire/xfiretest/socket.cpp @@ -0,0 +1,272 @@ +// Copied from http://linuxgazette.net/issue74/tougher.html
+// (only slightly modified)
+// heavy modified (für windows umgeschrieben) - dufte
+
+// Implementation of the Socket class.
+
+
+#include "stdafx.h"
+
+#include "xdebug.h"
+#include "socket.h"
+#include "string.h"
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <iostream>
+
+/*NETLIB*****************/
+#include "newpluginapi.h"
+#include "m_netlib.h"
+extern HANDLE hNetlib;
+/*NETLIB*****************/
+
+
+using namespace std;
+
+Socket::Socket( std::string host, int port, int useproxy, std::string proxyhost , int proxyport ) :
+ m_sock ( -1 )
+{
+
+ memset ( &m_addr,
+ 0,
+ sizeof ( m_addr ) );
+
+ if(!create()) {
+ throw SocketException( "Could not create socket." );
+ }
+ if(!connect(host,port,useproxy,proxyhost,proxyport)) {
+ throw SocketException( "Could not bind port." );
+ }
+}
+
+Socket::~Socket()
+{
+ Netlib_CloseHandle(this->netlibcon);
+}
+
+bool Socket::create()
+{
+
+/*
+ m_sock = socket ( AF_INET, SOCK_STREAM, 0 );
+
+
+ if ( ! is_valid() )
+ return false;*/
+
+
+ // TIME_WAIT - argh
+// int on = 1;
+ //if ( setsockopt ( m_sock, SOL_SOCKET, SO_REUSEADDR, ( const char* ) &on, sizeof ( on ) ) == -1 )
+// return false;
+
+ return true;
+
+}
+
+
+
+bool Socket::bind ( const int port )
+{
+/* if ( ! is_valid() )
+ {
+ return false;
+ }
+
+
+
+ m_addr.sin_family = AF_INET;
+ m_addr.sin_addr.s_addr = INADDR_ANY;
+ m_addr.sin_port = htons ( port );
+
+ int bind_return = ::bind ( m_sock,
+ ( struct sockaddr * ) &m_addr,
+ sizeof ( m_addr ) );
+
+
+ if ( bind_return == -1 )
+ {
+ return false;
+ }
+*/
+ return true;
+}
+
+
+bool Socket::listen() const
+{
+ /*if ( ! is_valid() )
+ {
+ return false;
+ }
+
+ int listen_return = ::listen ( m_sock, MAXCONNECTIONS );
+
+
+ if ( listen_return == -1 )
+ {
+ return false;
+ }
+*/
+ return false;
+}
+
+
+bool Socket::accept ( Socket& new_socket ) const
+{
+ /*int addr_length = sizeof ( m_addr );
+ new_socket.m_sock = ::accept ( m_sock, ( sockaddr * ) &m_addr, ( socklen_t * ) &addr_length );
+
+ if ( new_socket.m_sock <= 0 )
+ return false;
+ else
+ return true;*/
+ return false;
+
+}
+
+bool Socket::send ( char *buf, int length ) const {
+ int status = Netlib_Send(this->netlibcon,buf, length,0); //::send ( m_sock, buf, length, 0);
+ if ( status == -1 )
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+bool Socket::send ( const std::string s ) const
+{
+ int status = Netlib_Send(this->netlibcon,s.c_str(), s.size(),0); //::send ( m_sock, s.c_str(), s.size(), 0);
+ if ( status == -1 )
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+int Socket::recv ( char *buf, int maxlen ) const {
+ int status = Netlib_Recv(this->netlibcon,buf,maxlen,0); //::recv( m_sock, buf, maxlen, 0 );
+
+ if ( status == -1 )
+ {
+ //std::cout << "status == -1 errno == " << errno << " in Socket::recv WSA:::" << ::WSAGetLastError() << "\n";
+ return 0;
+ }
+ return status;
+}
+
+int Socket::recv ( std::string& s ) const
+{
+ char buf [ MAXRECV + 1 ];
+
+ s = "";
+
+ memset ( buf, 0, MAXRECV + 1 );
+
+ int status = Netlib_Recv(this->netlibcon,buf,MAXRECV,0);//::recv ( m_sock, buf, MAXRECV, 0 );
+
+ if ( status == -1 )
+ {
+ //std::cout << "status == -1 errno == " << errno << " in Socket::recv\n";
+ return 0;
+ }
+ else if ( status == 0 )
+ {
+ return 0;
+ }
+ else
+ {
+ s = buf;
+ return status;
+ }
+}
+
+
+
+bool Socket::connect ( const std::string host, const int port, int useproxy,std::string proxyhost,int proxyport)
+{
+ //if ( ! is_valid() ) return false;
+
+ /*m_addr.sin_family = AF_INET;
+ if(useproxy)
+ {
+ m_addr.sin_port = htons ( proxyport );
+ m_addr.sin_addr.s_addr=inet_addr(proxyhost.c_str());
+ }
+ else
+ {
+ m_addr.sin_port = htons ( port );
+ m_addr.sin_addr.s_addr=inet_addr(host.c_str());
+ }
+ */
+
+ int status = 0; //inet_pton ( AF_INET, host.c_str(), &m_addr.sin_addr );
+
+ /* XDEBUG(("Is valid .. %d\n",status));
+ if ( errno == EAFNOSUPPORT ) return false; */
+ //status = ::connect ( m_sock, ( sockaddr * ) &m_addr, sizeof ( m_addr ) );
+ + /*if(useproxy&&status==0) { + char temp[1024]; + this->send("CONNECT cs.xfire.com:25999 HTTP/1.1\nHost: cs.xfire.com:25999\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)\n\n"); + this->recv((char*)temp,1024); + }*/
+
+ NETLIBOPENCONNECTION ncon = { 0 };
+ ncon.cbSize = sizeof(ncon);
+ ncon.szHost = "cs.xfire.com";
+ ncon.wPort = (WORD)atol("25999");
+ ncon.timeout=5;
+ netlibcon = (HANDLE) CallService(MS_NETLIB_OPENCONNECTION, (WPARAM) hNetlib, (LPARAM) & ncon);
+
+
+ //std::cout << "status: " << status << std::endl;
+ if ( netlibcon != NULL )
+ {
+ //CallService(MS_NETLIB_OPENCONNECTION, (WPARAM) hNetlib, (LPARAM) & ncon);
+ m_sock=CallService(MS_NETLIB_GETSOCKET,(WPARAM) netlibcon,0);
+ return true;
+ }
+ else {
+ int errsv = errno;
+ if(errsv == SOCKET_ERROR) {
+ // std::cout << "Connection refused to " << host << ":" << port << std::endl;
+ throw SocketException( "Connection refused." );
+ }
+ //std::cout << "errno: " << errsv << std::endl;
+ return false;
+ }
+}
+
+void Socket::set_non_blocking ( const bool b )
+{
+/* u_long arg=0;
+
+ if(b) arg=1;*/
+
+ //ioctlsocket(m_sock, 0x8004667e,&arg);
+// int opts;
+
+ /* opts = fcntl ( m_sock,
+ F_GETFL );
+
+ if ( opts < 0 )
+ {
+ return;
+ }
+*/
+ //if ( b )
+ // opts = ( opts | O_NONBLOCK );
+ /*else
+ opts = ( opts & ~O_NONBLOCK );*/
+
+ /*fcntl ( m_sock,
+ F_SETFL,opts );*/
+
+}
|