c++socket心拍メカニズムコード

3827 ワード

server.h:
#pragma once #include #include #include #pragma comment (lib ,“ws2_32.lib”)
class server { public: server(); ~server(); void severStart(int port); void serverStop(); void serverAccpt(); void serverRecv(); void selectHeart(); private: SOCKET serverSide; SOCKET clientSide; std::map clientHeart; };
server.cpp
#include “stdafx.h” #include “server.h” #include #include using namespace std;
server::server() { }
server::~server() { }
//サーバvoid server::severStart(int port){WsadatA wsa={0};WSAStartup(MAKEWORD(2, 2), &wsa);//関数WSAstartup()を使用して、対応するバージョンのソケットライブラリをバインドします.0が正常に返されました.
//     (   :)                          
//socket(domain = AF_INET, type = SOCK_STREAM, proto = IPPROTO_TCP)
serverSide = socket(AF_INET, SOCK_STREAM, 0);
//1.domain : Domain        ” ”  AF_UNIX:AF_LOCAL      AF_INET : IPv4      AF_INET6 : IPv6      AF_PACKET :      
//2. Type: Type  socket   ,  AF_INET          (SOCK_STREAM)、      (SOCK_DGRAM)、     (SOCK_RAW)

SOCKADDR_IN addr;  //   
addr.sin_family = AF_INET; //       IPV4
addr.sin_port = htons(port); //           
addr.sin_addr.s_addr = htonl(INADDR_ANY); //   IP  ;

// bind()            IP      ,         ,              。
//  :
//	1)、sockfd:              socket
//	2)、sockaddr :                (   、IP、   )
::bind(serverSide, (SOCKADDR *)&addr, sizeof(addr));
	// listen(int  sockfd, int  backlog);
//  :       socket bind       ,accept      。
//	  :       sockfd      。
//	  :sockfd:   ,           ,      accept                ;
//         backlog:       backlog      ,   0-5。
listen(serverSide, 5);
thread t1(&server::serverAccpt, this);
t1.detach();

}
void server::serverStop(){closesocket(serverSide);cout<<サービス側閉鎖"<//接続クライアントvoid server::serverAccpt()/心拍数thread tt(&server::selectHeart,this);tt.detach();while(true){SOCKADDR_IN clientAddr;int len=sizeof(clientAddr);//accept関数の戻り値は、クライアント側とサーバ接続のSOCKETタイプの記述子であり、サーバ側でこのクライアントを識別している.clientSide=accept(serverSide,(SOCKADDR*)&clientAddr, &len); if(clientSide==INVALID_ATOM){cout<<無効な接続<//新聞を受け取る.void server::serverRecv() { while (true) { char buff[1024] = {0};//recv(socket s,char*buf,int len,intflag)/パラメータsocket:メッセージを転送できるソケット//パラメータbuf:メッセージを受信する文字列キャッシュ//パラメータlen:文字列を受信できるキャッシュの最大長//4番目のパラメータ:関数行に影響を与える一般的に0//sendとrecvに設定すると、実際にはwriteとread関数に基づいて4番目のパラメータが拡張されます:int res=recv(clientSide,buff,sizeof(buff)、0);if(res<=0){cout<<<接続切断***<//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////t<<「クライアント切断」 << endl; closesocket(clientSide); clientHeart.erase(iter++);//iter++;末尾に削除するとforループのiter++は後ろにアドレスが存在しないことを指します.プログラムが崩れるif(iter==clientHeart.end(){cout<<<末尾まで"<mian.cpp
#include “stdafx.h” #include “server.h” #include #include using namespace std;
int main() { server s; s.severStart(7777); string cmd; cin >> cmd; if (cmd ==“exit”) { s.serverStop(); } return 0; }