接続要求を受け入れる部分だけをマルチスレッドで起動したいのですが
スレッドの扱い方がわからず質問した次第です
//クライアントからの接続を受け入れる
decltype(sockadd) from;
int from_length = sizeof(from);
SOCKET sock; //クライアント側のソケット
sock = accept(listen_socket, reinterpret_cast<sockaddr*>(&from), &from_length);
if (sock == INVALID_SOCKET)
{
cout << "accept failure.\n";
closesocket(listen_socket);
WSACleanup();
return 1;
}
これはあるサイトのソースコードを参考にしたのですが、
decltype(sockadd) from;
int from_length = sizeof(from);
この部分で何をしているかがよく解らず、
この部分も教えていただけるとありがたいです。
言葉足らずですが、よろしくお願いします。
#include <winsock2.h>
#include <iostream>
#include <string>
#include "thread.h"
using namespace std;
#pragma comment(lib, "WSock32.lib")
int server();
int main()
{
server();
}
int server()
{
WSADATA wsadata;
if(WSAStartup(MAKEWORD(2,2),&wsadata)!= 0)
{
cout << "winsock startup failed.\n";
return 1;
}
const auto listen_socket = socket(PF_INET,SOCK_STREAM,0); //サーバ側ソケット
if(listen_socket== INVALID_SOCKET)
{
cout << "ソケットエラー\n";
WSACleanup();
return 1;
}
//IPv4のソケットアドレス情報を設定する
sockaddr_in sockadd;
memset(&sockadd, 0, sizeof(sockadd));
sockadd.sin_family = AF_INET;
cout << "ポート番号\n>";
u_short port = 0;
cin >> port;
sockadd.sin_port = htons(port);
sockadd.sin_addr.s_addr = INADDR_ANY;
//ソケットに名前をつける
if(bind(listen_socket, reinterpret_cast<sockaddr*>(&sockadd), sizeof(sockadd)) == SOCKET_ERROR)
{
cout << "bind failure.\n";
closesocket(listen_socket);
WSACleanup();
return 1;
}
//接続待ち状態にする
if(listen(listen_socket,0)== SOCKET_ERROR)
{
cout << "listen failure.\n";
closesocket(listen_socket);
WSACleanup();
return 1;
}
//クライアントからの接続を受け入れる
decltype(sockadd) from;
int from_length = sizeof(from);
SOCKET sock; //クライアント側のソケット
sock = accept(listen_socket, reinterpret_cast<sockaddr*>(&from), &from_length);
if (sock == INVALID_SOCKET)
{
cout << "accept failure.\n";
closesocket(listen_socket);
WSACleanup();
return 1;
}
cout << inet_ntoa(from.sin_addr) << "が接続してきました\n";
//メッセージを送受信
string buffer;
while (true)
{
cout << "クライアントからの受信を待っています\n>";
char buf[1024];
memset(buf, '\0', sizeof(buf));
const auto rec = recv(sock, buf, sizeof(buf)-1, 0);
if (rec == SOCKET_ERROR)
{
cout << "エラーです\n";
break;
}
buf[rec] = '\0';
if (strcmp(buf, "end") == 0)
{
cout << "クライアントが接続を切りました\n";
break;
}
cout << "受信:" << buf << endl;
cout << "送信\n>";
cin >> buffer;
send(sock, buffer.c_str(), buffer.size(), 0);
if (buffer == "end")
{
break;
}
}
//ソケットの送受信を切断する
shutdown(sock, SD_BOTH);
//ソケットを破棄する
closesocket(sock);
//WinSockの解放
WSACleanup();
cout << "終了します\n";
return 0;
}