Winsockのラッパークラスの作成

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
shiro4ao
記事: 224
登録日時: 9年前
住所: 広島

Winsockのラッパークラスの作成

#1

投稿記事 by shiro4ao » 9年前

Winsockのクライアント用のラッパークラスをつくろうとしています。
以下のように実装したのですが、サーバーに接続出来ていないようでした。
各メンバ関数からのエラーも出ていないようなので行き詰ってしまいました。
どこがおかしいのでしょう?
それとも根本からおかしいのでしょうか?
教えていただければ幸いです。

コード:

#include    <stdio.h>
#include    <conio.h>
#include    <winsock2.h>

class TcpClient01 {
public:
	WSADATA wsaData;
	struct  sockaddr_in server;
	SOCKET sock;
	char port[10],target[2000];

	int CreateSocket(){
	    sock= socket(AF_INET,SOCK_STREAM,0);
    		if (sock == INVALID_SOCKET)return -1;
	}

        //今回テストなので第2引数は無視されます
	int SetSockAddr(char *port,char *target){
		int nport;
		nport=atoi(port);
		if(nport==0)return -1;

    		server.sin_family = AF_INET;
    		server.sin_port = htons(nport);
    		server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	}
	
	int SockConnect(){
		connect(sock, (struct sockaddr *)&server, sizeof(server));
	}
	
	int SockRecv(char *buf,int Flag){
		int ret;
		ret=recv(sock,buf,sizeof(buf),Flag);
		return ret;
	}

	int SockSend(char *buf,int Flag){
		int ret;
		ret=send(sock,buf,sizeof(buf),Flag);
		return ret;
	}

	int DestroySock(){
		closesocket(sock);
	}

} TcpClient01 ;




int main(void)
{  
    TcpClient01 client;
    char    buf[4024];
    int ret,i=0;

    // winsock2の初期化
    if (WSAStartup(MAKEWORD(2,0), &wsaData))
    {   printf("winsock の初期化に失敗しました\n");
        getch();
        return 1;
    }    
    
    //メンバ関数のエラーを確認
    if(client.CreateSocket()==-1)printf("Error1");
    if(client.SetSockAddr("5555","localhost")==-1)printf("Error2");
    if(client.SockConnect()==-1)printf("Error3");


    for(;;){
    		memset(buf,'\0',sizeof(buf));
    		client.SockRecv(buf,0);
    		printf("受信メッセージ→%s\n",buf);
    		memset(buf,'\0',sizeof(buf));
    		printf("送信メッセージ→");
    		gets(buf);
    		client.SockSend(buf,0);    

    }

    client.Destroy();

    // winsock2の終了処理
    WSACleanup();
    getch();
    return 0;
}



アバター
Ciel
記事: 252
登録日時: 9年前

Re: Winsockのラッパークラスの作成

#2

投稿記事 by Ciel » 9年前

ざっと見ました。

成功したとしても目的のバージョンがしようされてない可能性がありますので、
ちゃんと2.0のバージョンが適用されてるかチェック処理をいれたほうが良いと思いますよ。

次に、int SetSockAddr関数について。
portが0だったときに戻り値を返してますが、そうでないときに何も値を返してないようですが、大丈夫ですか?
それに引数のtargetも使われてないようですけどいいんですか?

次に接続型のサーバであれば、終了時にshutdown関数も実行したほうがよいと思います。

以上。

追記:
間違えたところがあったので一部削除しました。
oui C'est la Vie♪

アバター
shiro4ao
記事: 224
登録日時: 9年前
住所: 広島

Re: Winsockのラッパークラスの作成

#3

投稿記事 by shiro4ao » 9年前

>Cielさん
ありがとうございます。

WSAStartupをメンバ関数にして見たところうまくいきました。
ありがとうございました。
これにて解決にさせていただきたいと思います。

コード:

#include    <stdio.h>
#include    <conio.h>
#include    <winsock2.h>



class TcpClient01 {
public:
	WSADATA wsaData;
	struct  sockaddr_in server;
	SOCKET sock;
	char port[10],target[2000];

	int InitWSAdata(){
		if(WSAStartup(MAKEWORD(2,0), &wsaData)==0)return -1;
		return 0;
	}
	
	int CreateSocket(){
	    sock= socket(AF_INET,SOCK_STREAM,0);
    		if (sock == INVALID_SOCKET)return -1;
	}

	int SetSockAddr(char *port,char *target){
		int nport;
		nport=atoi(port);
		if(nport==0)return -1;

    		server.sin_family = AF_INET;
    		server.sin_port = htons(nport);
    		server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
		return 0;
	}
	
	int SockConnect(){
		connect(sock, (struct sockaddr *)&server, sizeof(server));
	}
	
	int SockRecv(char *buf,int Flag){
		int ret;
		ret=recv(sock,buf,sizeof(buf),Flag);
		return ret;
	}


	int SockSend(char *buf,int Flag){
		int ret;
		ret=send(sock,buf,sizeof(buf),Flag);
		return ret;
	}

	int DestroySock(){
		closesocket(sock);
	}



} TcpClient01 ;







int main(void)
{  
    class TcpClient01 client;
    char    buf[4024];
    int ret,i=0;


    client.InitWSAdata();


    //メンバ関数のエラーを確認
    if(client.CreateSocket()==-1)printf("Error1");
    if(client.SetSockAddr("5555","localhost")==-1)printf("Error2");
    if(client.SockConnect()==-1)printf("Error3");


    for(;;){
    		memset(buf,'\0',sizeof(buf));
    		client.SockRecv(buf,0);
    		printf("受信メッセージ→%s\n",buf);
    		memset(buf,'\0',sizeof(buf));
    		printf("送信メッセージ→");
    		gets(buf);
    		client.SockSend(buf,0);    

    }





    client.DestroySock();

    // winsock2の終了処理
    WSACleanup();
    getch();
    return 0;
}



閉鎖

“C言語何でも質問掲示板” へ戻る