コード:
SERVER::SERVER() {
}
int SERVER::Stert() {
sock_lobby = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //ソケットの作成
if (sock_lobby == INVALID_SOCKET) {
WSA_ERR("ソケットの作成に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("ロビーソケットを作成しました");
bool yes = true; //1が登録されたポインタを作成
setsockopt(sock_lobby, SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof(yes)); //TIME_WAIT状態への対策(ソケットオプションの設定
addr.sin_family = AF_INET; //ソケットの設定をする
addr.sin_port = htons(PORT); //使用するポート
addr.sin_addr.S_un.S_addr = INADDR_ANY; //接続するアドレス
if (bind(sock_lobby, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
WSA_ERR("ローカルアドレスとソケットの関連付けに失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("ローカルアドレスとソケットの関連付けが完了しました");
u_long val = 1; //ノンブロッキング(非同期通信)に設定する
ioctlsocket(sock_lobby, FIONBIO, &val);
if (listen(sock_lobby, 5) != 0) { //TCPクライアントからの接続要求を待てる状態にする
WSA_ERR("ソケットをリッスン状態にできませんでした(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("ソケットを通信受付状態にしました");
AddTempLog("ロビーソケットの初期化が正常に終了しました port=%d", PORT);
return COMM_LIB_NO_ERROR;
}
int SERVER::Accept() {
int len = sizeof(client_addr); //TCPクライアントからの接続要求を受け付ける
sock = accept(sock_lobby, (struct sockaddr *)&client_addr, &len);
if (sock == INVALID_SOCKET) { //ソケットの値が正常ではない
if (WSAGetLastError() != WSAEWOULDBLOCK) { //要請がない場合ではなかったら
WSA_ERR("クライアントからの接続に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
}
else { //接続要請があれば
hostent *host = gethostbyaddr((const char *)&client_addr.sin_addr, sizeof(addr.sin_addr), AF_INET);
if (host == NULL) { //失敗したらエラーを表示して終了
WSA_ERR("ホスト情報の取得に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
AddServerLog(" accepted connection from [%s], ip=%s, port=%d", host->h_name, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
return 1;
}
return COMM_LIB_NO_ERROR;
}
int SERVER::Recv(char data[]) {
char buf[MAX_DATA_SIZE];
memset(buf, 0, sizeof(buf));
int n = recv(sock, buf, sizeof(buf), 0);
if (n < 0) {
if (WSAGetLastError() != WSAEWOULDBLOCK) { //何らかのエラーが発生している
WSA_ERR("データの受信に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
}
else if (n != 0) { //データが届いたら
AddTempLog("データを受信しました-%d「%.64s」", n, buf);
sprintf_s(data, 1024, "%s", buf);
return n;
}
return COMM_LIB_NO_ERROR;
}
int SERVER::Send(const TCHAR *data, int size) {
if (send(sock, data, /*strlen(data)*/size, 0) < 1) {
WSA_ERR("データの送信に失敗しました(%d)", WSAGetLastError());
closesocket(sock); //TCPセッションの終了
memset(&sock, 0, sizeof(sock));
return COMM_LIB_ERROR;
}
else AddTempLog("データを送信しました「%.64s」", data);
closesocket(sock); //TCPセッションの終了
memset(&sock, 0, sizeof(sock));
return COMM_LIB_NO_ERROR;
}
CLIENT::CLIENT() {
}
int CLIENT::Recv(char data[]) {
char buf[MAX_DATA_SIZE];
memset(buf, 0, sizeof(buf));
int n = recv(sock, buf, sizeof(buf), 0);
if (n < 0) {
if (WSAGetLastError() != WSAEWOULDBLOCK) { //何らかのエラーが発生している
WSA_ERR("データの受信に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
}
else if (n != 0) { //データが届いたら
AddTempLog("データを受信しました-%d「%.64s」", n, buf);
closesocket(sock); //TCPセッションの終了
memset(&sock, 0, sizeof(sock));
sprintf_s(data, n, "%s", buf);
return n;
}
return COMM_LIB_NO_ERROR;
}
int CLIENT::Send(const TCHAR *data, int size) {
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //ソケットの作成
if (sock == INVALID_SOCKET) {
WSA_ERR("ソケットの作成に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("ソケットを作成しました");
server_addr.sin_family = AF_INET; //ソケットの設定をする
server_addr.sin_port = htons(PORT); //使用するポート
hostent *host = gethostbyname(host_name); //リリース時にはホストIPを使う
if (host == NULL) {
WSA_ERR("サーバー情報がありません");
return COMM_LIB_ERROR;
}
server_addr.sin_addr.S_un.S_addr = *(unsigned int *)host->h_addr_list[0]; //サーバーIPアドレスを取得する
AddTempLog("サーバー情報の取得に成功しました");
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) != 0) {//サーバに接続を試みる
WSA_ERR("サーバーに接続できませんでした(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("サーバーに接続しました");
if (send(sock, data, size, 0) < 1) {
WSA_ERR("データの送信に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("データの送信に成功しました");
return COMM_LIB_NO_ERROR;
}