/**** ファイル名 : MainWindow.h ****/
#ifndef MAINWINDOW #define MAINWINDOW //--------------------------------------------------------------------- #include <Be.h> #include <be/net/socket.h> //--------------------------------------------------------------------- #define MAINWINDOW_TITLE "Network" #define MAINWINDOW_POSITION_LEFT 100 #define MAINWINDOW_POSITION_TOP 100 #define MAINWINDOW_POSITION_WIDTH 400 #define MAINWINDOW_POSITION_HEIGHT 128 #define MAINWINDOW_WINDOWSTYLE (B_TITLED_WINDOW) //--------------------------------------------------------------------- #define MSG_CONNECT 'cnnb' #define MSG_LISTEN 'lstb' #define MSG_SEND 'sndb' //--------------------------------------------------------------------- class BAppMainView : public BView { public: BStringView *strview; BTextControl *textctrl; BButton *connectbtn; BButton *listenbtn; BButton *sendbtn; BAppMainView(BRect frame); }; //--------------------------------------------------------------------- class BAppMainWindow : public BWindow { public: BAppMainView *mainview; //----------------------------------------------------------------- BAppMainWindow(BRect frame,const char *title); virtual void MessageReceived(BMessage *msg); //----------------------------------------------------------------- bool QuitRequested(); //----------------------------------------------------------------- void sock_connect(void); void sock_listen(void); void sock_send(void); }; //--------------------------------------------------------------------- #endif
/**** ファイル名 : MainWindow.cpp ****/
//--------------------------------------------------------------------- #include "MainWindow.h" //--------------------------------------------------------------------- BAppMainWindow::BAppMainWindow(BRect frame,const char *title) :BWindow(frame,title,MAINWINDOW_WINDOWSTYLE,0) { mainview=new BAppMainView(Bounds()); AddChild(mainview); } //--------------------------------------------------------------------- void BAppMainWindow::MessageReceived(BMessage *msg) { switch(msg->what) { case MSG_SEND: sock_send(); break; case MSG_CONNECT: sock_connect(); break; case MSG_LISTEN: sock_listen(); break; default: BWindow::MessageReceived(msg); } } //--------------------------------------------------------------------- BAppMainView::BAppMainView(BRect frame) :BView(frame,"bappmainview",B_FOLLOW_ALL,B_WILL_DRAW) { BRect viewrect(Bounds()); connectbtn=new BButton(BRect(viewrect.right-144,8, viewrect.right-80,28),"connectbtn", "Connect",new BMessage(MSG_CONNECT), B_FOLLOW_RIGHT | B_FOLLOW_TOP); AddChild(connectbtn); listenbtn=new BButton(BRect(viewrect.right-72,8, viewrect.right-8,28),"listenbtn", "Listen",new BMessage(MSG_LISTEN), B_FOLLOW_RIGHT | B_FOLLOW_TOP); AddChild(listenbtn); sendbtn=new BButton(BRect(viewrect.right-72,98, viewrect.right-8,118),"sendbtn", "Send",new BMessage(MSG_SEND), B_FOLLOW_RIGHT | B_FOLLOW_TOP); AddChild(sendbtn); textctrl=new BTextControl(BRect(8,38,viewrect.right-8,58),"textctrl", NULL,"Default",NULL, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); AddChild(textctrl); strview=new BStringView(BRect(8,68,viewrect.right-8,88),"strview", "NoData", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); AddChild(strview); textctrl->SetEnabled(false); sendbtn->SetEnabled(false); } //--------------------------------------------------------------------- void BAppMainWindow::sock_connect(void) { } //--------------------------------------------------------------------- void BAppMainWindow::sock_listen(void) { } //--------------------------------------------------------------------- void BAppMainWindow::sock_send(void) { } //--------------------------------------------------------------------- bool BAppMainWindow::QuitRequested() { be_app->PostMessage(B_QUIT_REQUESTED); return true; }; //---------------------------------------------------------------------
と記述し、int型の値として取得します。int ssock = socket(AF_INET,SOCK_STREAM,0);
sin_familyには必ずAF_INETを指定します。sin_portには使用するポートを指定します。struct sockaddr_in sa; sa.sin_family=AF_INET; sa.sin_port=htons(10000); sa.sin_addr.s_addr=INADDR_ANY; memset(sa.sin_zero,0,sizeof(sa.sin_zero)); bind(ssock,(struct sockaddr *)&sa,sizeof(sa));
※nsockは、BAppMainWindowクラスのprivateメンバとして定義しておきます。型はint型です。listen(ssock,5); sa_size=sizeof(sa); nsock=accept(ssock,(struct sockaddr *)&sa, &sa_size);
struct sockaddr_in sa;
int r;
nsock=socket(AF_INET, SOCK_STREAM, 0);
sa.sin_family=AF_INET;
sa.sin_port=htons(10000);
sa.sin_addr.s_addr=inet_addr("127.0.0.1");
memset(sa.sin_zero,0,sizeof(sa.sin_zero));
r=connect(nsock,(struct sockaddr *)&sa,sizeof(sa));
ソケットはsocket関数で作成します。サーバと同じように、sockaddr_in構造体で接続のための情報をセットします。ここでサーバと違うのはsin_addr.s_addrに接続先のアドレスを指定していることです。
if(r!=-1)
{
mainview->strview->SetText("Connect");
}
do
{
tv.tv_sec=2;
tv.tv_usec=0;
FD_ZERO(&fds);
FD_SET(nsock,&fds);
select(32,&fds,NULL,NULL,&tv);
} while(FD_ISSET(nsock,&fds)==0);
rec=recv(nsock,buf,sizeof(buf),0);
if(rec<=0)
{
closesocket(nsock);
nsock=-1;
strcpy(buf,"Disconnect");
}
mainview->strview->SetText(buf);
※tvはtimeval構造体、fdsはfd_set構造体です。
void BAppMainWindow::sock_send(void)
{
int r;
r=send(nsock,mainview->textctrl->Text(),
strlen(mainview->textctrl->Text())+1,0);
if(r==-1)
{
closesocket(nsock);
nsock=-1;
mainview->strview->SetText("Disconnect");
}
}
送信は、send関数を使用します。| 圧縮ファイル R5 Intel環境で確認 |
be6thapp20000918.zip |
| ソースファイル | BaseApp.h |
| main.cpp | |
| MainWindow.cpp | |
| MainWindow.h |