1. 程式人生 > >Socket客戶端,伺服器通訊demo

Socket客戶端,伺服器通訊demo

#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; }

相關推薦

Socket客戶伺服器通訊demo

#include "Socket.h" #include <iostream> using namespace std; int Socket::nofSockets_= 0; void Socket::Start() { if (!nofSockets_) {

Android 使用mina框架 搭建socket客戶進行與伺服器通訊

注意: 在設定編碼過濾的時候 一定要注意 伺服器端和客戶端的編碼要一致 mina框架解釋 簡單理解就是 :封裝了底層的讀寫流操作,提供高階操作API的通訊框架 當前發行的 MINA 版本支援基於Java NIO 技術的 TCP/UDP 應用程式開發、串

Java Socket多個客戶伺服器通訊

client程式碼: package com.cqut.test4; import java.io.*; import java.net.Socket; import java.net.SocketException; import java.net.U

linux下socket程式設計 select實現非阻塞模式多臺客戶伺服器通訊

select函式原型如下: int select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select系統呼叫是用來讓我們的程式

java socket 客戶伺服器互相通訊(聊天)

客戶端: package com.lzx.socket; import java.io.BufferedReader; import java.io.IOException; import jav

C++基礎--完善Socket C/S 實現客戶伺服器斷開重連

相關文章 1 // WindowsSocketServer.cpp : 定義控制檯應用程式的入口點。 2 // 3 4 #include "stdafx.h" 5 #include <iostream&

C++ Socket C/S 實現客戶伺服器斷開重連

// WindowsSocketServer.cpp : 定義控制檯應用程式的入口點。 #include "stdafx.h" #include <iostream> #include <string> #include <Windows.h> #include <

五、通過Protobuf整合Netty實現對協議訊息客戶伺服器通訊實戰

目錄 一、Protocol Buffers 是什麼? 二、Protocol Buffers 檔案和訊息詳解 三、專案實戰,直接掌握的protobuf應用。 一、Protocol Buffers 是什麼?         1、官網翻譯

unity3D-----------socket客戶伺服器(簡單)

利用socket簡單的實現,客戶端和伺服器之間的通訊。 客戶端: using UnityEngine; using System.Collections; using System.Text; using System.Net; using System.Net.Soc

OPC協議解析-OPC客戶伺服器通訊解析

1      OPC伺服器 OPC伺服器, 是指按照OPC基金組織規定的OPC規範群開發的軟體驅動。OPC伺服器作為中間媒介負責從資料來源讀取資料再跟另外一端的客戶端通訊。在 OPC客戶端/伺服器 的結構圖中, 通訊的發起端是, 也只能是OPC客戶端。客戶端

QT 中Socket客戶伺服器異常斷開後重連

在現在的專案開發中,經常要使用TCP/IP協議來進行通訊,但有時候與伺服器端的連結由於網路問題導致連線異常或斷開,這就需要我們的軟體能自動重連,在Linux中,我們的思維一般是通過心跳包來監控連線是否斷開,有時候還單獨開一個執行緒,但是在QT中,就變得簡單多了,當連線異常

實現PHP伺服器+Android客戶(Retrofit+RxJava)第四天客戶伺服器通訊的實現

我的上一篇文章已經介紹了retrofit+rxjava的配置(包括快取),從這一篇開始就開始講我要實現的這個app網路請求部分的構思,也就是要請求那些資料,資料的型別等等。 我要實現的客戶端 看圖: 看了介面基本應該能知道要實現的效果了

cocos creator專案實戰全套(客戶伺服器資料庫)視訊教程

問題諮詢 為了避免由於網頁溝通的不及時所引起的誤會,特提供客服QQ:1927832684      普通學員交流群:572270243                  有問題及時反饋,避免發生不必要的誤會! 課程簡介課程特色:專案為主,一切跟著專案走,拒絕高大上,拒絕瞎比比,腳踏實地,實踐為主! 課程內容:

java網路程式設計客戶伺服器

伺服器端test1 ServerSocket server = new ServerSocket(6060); Socket socket = server.acc

討論一下大使用者量應用客戶伺服器通訊技術方案選擇

最近公司正在做一個專案,該專案的客戶端應用相當廣泛,類似與QQ這樣的專案。其中有一項要求服務端與普通使用者的客戶端程式能適時互動。當服務端系統狀態有變化時,能及時通知所有線上的使用者更新資料。由於客戶端使用者數量群較大,

客戶伺服器通訊

       最近準備做一個考試系統,所以學習了一下C/S的通訊,就現在所知的來說,一般用的通訊方式有Web Service、Remoting,還有一種較新的技術WCF, 但我還沒學習到,所以暫不涉及。        開篇即將記錄的是最基本的Socket,在.Net中,微軟將

什麼是socket?什麼是socket的長、短連線?java如何簡單實現socket客戶伺服器

*socket就是套接字,是一種通訊方式!採用這種方式可以實現客戶端和伺服器之間的通訊! 百度百科的解釋:        Socket的英文原義是“孔”或“插座”。作為BSD UNIX的程序通訊機制,取後一種意思。通常也稱作"套接字",用於描述IP地址和埠,是一個通訊鏈的控

Netty簡單示例----客戶伺服器通訊

本例實現功能為客戶端獲取伺服器的時間並顯示,參考《Netty權威指南》一書,不過書中使用Netty5實現的,考慮到Netty已經下架5,本例子使用Netty4.1.6版本。 首先伺服器端,包括TimeServer、TimeServerHandler兩個類:

Onvif客戶伺服器通訊時鑑權的自實現

OnvifDigest.h /** SHA1 digest size in octets */ #define SOAP_SMD_SHA1_SIZE (20) /** Size of the random nonce */ #define SOAP_WSSE_NONCELEN (20) #define

C++基於TCP/IP簡單的客戶伺服器通訊程式例項

本篇文章實現了一個基於TCP 的一個非常簡單的客戶/伺服器通訊程式例項。該程式中通訊協議使用的是面向連線的TCP協議SOCK_STREAM, 伺服器的ip地址為本地地址即: 127.0.0.1,埠號為自定義的5099(大於1024即可),服務端的功能只要有客戶