エコーサーバを作るという課題で、配布された資料や本、友人に聞いたりして、途中までは頑張ったのですが、その後がわかりません。
プログラムは次の通りです。
EchoSever.cpp
#include <iostream>
#include <string>
#include <WinSock.h>
#include "CommSocket.h"
static void DgramEchoServer(int port);
int main()
{
int port = 10000;
WSADATA wsaData;
WSAStartup(2, &wsaData);
DgramEchoServer(port);
WSACleanup();
return 0;
}
static void DgramEchoSever(int port)
{
UDPSocket udpSock;
udpSock.Bind(port);
for (int i=0; i < 4; i++){
string msg;
udpSock >> msg;
cout << msg << endl;
udpSock << msg;
}
}
EchoClient.cpp
#include<iostream>
#include<string>
#include <WinSock.h>
#include "CommSocket.h"
static void DgramEchoClient(string addr, int port);
int main()
{
string addr("127.0.0.1");
int port = 10000;
WSADATA wsaData;
WSAStartup(2, &wsaData);
DgramEchoClient(addr, port);
WSACleanup();
return 0;
}
static void DgramEchoClient(string addr, int port)
{
UDPSocket udpSock;
udpSock.SetPeerAddress(addr, port);
for (int i = 0; i < 4; i++){
cin >> udpSock;
cout << udpSock << endl;
}
}
CommSocket.h
using namespace std;
const int BUFF_SIZE = 1024;
class CommSocket
{
protected:
int m_nSock;
char m_pcRecvBuffer[BUFF_SIZE];
public:
CommSocket();
virtual ~CommSocket() {};
virtual int SendString(string msg) = 0;
virtual int RecvString(string &msg) =0;
friend istream &operator>>(istream &stream, CommSocket &commSock);
friend ostream &operator<<(ostream &stream, CommSocket &commSock);
friend CommSocket &operator>>(CommSocket &commSock, string &msg);
friend CommSocket &operator<<(CommSocket &commSock, string &msg);
};
class UDPSocket
: public CommSocket
{
private:
sockaddr_in m_saPeerAddr;
public:
UDPSocket();
~UDPSocket();
void Bind(int port);
void SetPeerAddress(string addr, int port);
int SendString(string msg);
int RecvString(string &msg);
};
class TCPSocket
: public CommSocket
{
public:
int SendString(string msg);
int RecvString(string &msg);
};
CommSocket.cpp
#include <iostream>
#include <string>
#include <WinSock.h>
#include "CommSocket.h"
CommSocket::CommSocket(void)
: m_nSock(-1)
{
memset( m_pcRecvBuffer, 0, sizeof( m_pcRecvBuffer) );
//受信バッファを初期化する
}
istream &operator >> (istream &stream, CommSocket& commSock)
{
//stream から取得した文字列を通信相手に送る
return stream;
}
ostream &operator <<(ostream &stream, CommSocket& commSock)
{
//通信相手から受信した文字列をstreamへ出力する
return stream;
}
CommSocket &operator >>(CommSocket &commSock, string &msg)
{
string &msg = recvfrom(, , BUFF_SIZE, 0,
reinterpret_cast<struct sockaddr*>( ), );//通信相手から文字列を受信する
return commSock;
}
CommSocket &operator <<(CommSocket &commSock, string &msg)
{
string &msg = sendto(, , BUFF_SIZE, 0,
reinterpret_cast<struct sockaddr*>(& ), sizeof( ) );// 通信相手へ文字列を送信する
return commSock;
}
UDPSocket::UDPSocket()
: CommSocket()
{
m_nSock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); // メッセージの送受信に使うソケットを作成する
}
UDPSocket::UDPSocket()
{
closesocket(m_nSock);//ソケットを閉じる
}
void UDPSocket::Bind(int port)
{
memset(& , 0, sizeof( ));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(servPort); //ローカル用アドレス構造体へ必要な値を格納する
bind(m_nSock, reinterpret_cast<struct sockaddr*>(&servAddr), sizeof(servAddr) //ソケットとローカル用アドレス構造体を結びつける
}
void UDPSocket::SetPeerAddress(string addr, int port)
{
//通信相手用アドレス構造体へ必要な値を格納する
}
int UDPSocket::SendString(string msg)
{
//文字列を送信する
int res = 0; // sendto()の戻り値を代入する
return res;
}
int UDPSocket::RecvString(string &msg)
{
//文字列を受信する
int res = 0; //recvfrom() の戻り値を代入する
return res;
}
提出期限が迫っており、本当の課題はこれを完成させた後、追加機能を検討することなのですが、まずはこの4つを完成させなければ先へ進めません。
足りないのはコメントの部分なのです.
空白が多く、甘えた質問かもしれませんが、よければご教示ください。お願いします。