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が正常に返されました.
}
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; }
#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<<サービス側閉鎖"<
#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; }