Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.60 KB | None | 0 0
  1. #include "connection.h"
  2. #include <QDebug>
  3.  
  4.  
  5. bool Connection::openSocket(int addressFamily, int connectionType,
  6.                             int protocol) {
  7.     int flags = FD_ACCEPT | FD_CLOSE | FD_CONNECT | FD_WRITE;
  8.     int err = 0;
  9.     addressFamily_ = addressFamily;
  10.  
  11.     if ((socket_ = WSASocket(addressFamily_, connectionType, protocol, NULL, 0,
  12.                              WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET) {
  13.         throw "Connection::openSocket(): Can't create socket.";
  14.         return false;
  15.     }
  16.  
  17.     if ((err = WSAAsyncSelect(socket_, hWnd_, WM_WSASYNC,
  18.                               flags)) == SOCKET_ERROR) {
  19.         throw "Connection::startServer(): Error setting up async select.";
  20.         return false;
  21.     }
  22.  
  23.     return true;
  24. }
  25.  
  26.  
  27. bool Connection::startServer(int port) {
  28.     int err = 0;
  29.     std::ostringstream output;
  30.     SOCKADDR_IN serverSockAddrIn;
  31.  
  32.  
  33.     serverSockAddrIn.sin_family = AF_INET;
  34.     serverSockAddrIn.sin_port = htons(port);
  35.     serverSockAddrIn.sin_addr.s_addr = htonl(INADDR_ANY);
  36.  
  37.     if ((err = bind(socket_, (PSOCKADDR) &serverSockAddrIn,
  38.               sizeof(serverSockAddrIn)) == SOCKET_ERROR)) {
  39.         qDebug("Connection::startServer(): Can't bind name to socket.");
  40.         return false;
  41.     }
  42.  
  43.     qDebug("Connection::startServer(): Server bound port %d to TCP socket",
  44.            port);
  45.     output << "Server bound port " << port << " to TCP socket.";
  46.     emit status(QString(output.str().c_str()));
  47.  
  48.     if ((err = ::listen(socket_, 5)) == SOCKET_ERROR) {
  49.         err = WSAGetLastError();
  50.         qDebug("Connection::listen(); Error: %d.", err);
  51.         return false;
  52.     }
  53.  
  54.     return true;
  55. }
  56.  
  57. bool Connection::startClient(char* hostName, int port) {
  58.     PHOSTENT host;
  59.     SOCKADDR_IN serverSockAddrIn;
  60.     int err = 0;
  61.  
  62.     serverSockAddrIn.sin_family = AF_INET;
  63.     serverSockAddrIn.sin_port = htons(port);
  64.  
  65.     if ((host = gethostbyname(hostName)) == NULL) {
  66.         qDebug("Connection::startClient(): Unknown server address");
  67.         return false;
  68.     }
  69.  
  70.     qDebug() << "Connection::startClient(): Client connecting to host: "
  71.              << host->h_name << endl;
  72.     qDebug() << "Port: " << port;
  73.     memcpy((char*) &serverSockAddrIn.sin_addr, host->h_addr, host->h_length);
  74.  
  75.     // allow the TCP packets to linger for up to 10 seconds
  76.     LINGER* linger = (LINGER*) malloc(sizeof(LINGER));
  77.     linger->l_onoff = 1;
  78.     linger->l_linger = 1;
  79.     setsockopt(socket_, SOL_SOCKET, SO_LINGER, (char*) linger, sizeof(linger));
  80.  
  81.     if ((err = ::connect(socket_, (PSOCKADDR) &serverSockAddrIn,
  82.                    sizeof(SOCKADDR_IN))) == SOCKET_ERROR) {
  83.         if (WSAGetLastError() != WSAEWOULDBLOCK) {
  84.             qDebug("Connection::startClient(): Failed to connect to server. Error: %d", WSAGetLastError());
  85.             return false;
  86.         }
  87.     }
  88.  
  89.     return true;
  90. }
  91.  
  92. bool Connection::sendMessage(char* data, int data_length) {
  93.     int err = 0;
  94.     DWORD numBytesSent = 0;
  95.     WSAOVERLAPPED* ol;
  96.     WSABUF winsockBuff;
  97.  
  98.     winsockBuff.len = 1024;
  99.     winsockBuff.buf = (char*) malloc(1024 * sizeof(char));
  100.  
  101.     memset(winsockBuff.buf, 'p', 1024);
  102.  
  103.     ol = (WSAOVERLAPPED*) calloc(1, sizeof(WSAOVERLAPPED));
  104.     ol->hEvent = (HANDLE) winsockBuff.buf;
  105.  
  106.     //select(0, NULL, u
  107.  
  108.     if ((numBytesSent = WSASend(socket_, &winsockBuff, 1, &numBytesSent, 0,
  109.                                 ol, Connection::sendCompletionRoutine))
  110.             == SOCKET_ERROR) {
  111.         err = WSAGetLastError();
  112.         qDebug("Connection::sendMessage(); Error: %d", err);
  113.         return false;
  114.     }
  115.  
  116.     return true;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement