ページ 11

チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月19日(木) 16:48
by helloworld1853
チャット(ジョーク)プログラムを作っているのですが、

ある箇所で躓いています。

以下がソースコードです。

余計な箇所は省略しました。

コード:

#pragma comment(lib, "wsock32.lib")
#include <stdio.h>
#include <winsock2.h>
#define PORT 80
#define BUFF_SIZE 1024

int crypt(char buff[BUFF_SIZE])
{
	int key = 1853;
	size_t i;

	for(i=0;i<strlen(buff);i++)
	{
        buff[i] ^= key;
    }
	return 0;
}
int main(void)
{
	 char buf[BUFF_SIZE];
         //省略
         if(recv(sock, buf, sizeof(buf), 0)!=SOCKET_ERROR)
         {
                  crypt(buf);//復元
                  if(buf =="test")//ここでのbufの内容は"test"でした。(デバッグで確認)
                  {
                           puts("成功");
                  }
                  else
                  {
                           puts("失敗");
                  }
         }
//省略
}
このチャットプログラムの通信はcrypt関数で暗号化されています。

結果は "失敗" でした。

判定の箇所のコメントを見ればわかりますが、

判定がうまくいっていないようです。

よろしくお願いします。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月19日(木) 16:52
by softya(ソフト屋)
bufのポインタ値(アドレス)と"test"のポインタ値を比べていますので絶対に一致しません。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月19日(木) 21:11
by Dixq (管理人)
strcmp
http://www9.plala.or.jp/sgwr-t/lib/strcmp.html
を参考にして下さい。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月19日(木) 21:24
by softya(ソフト屋)
前々からポインタや文字列などの理解が曖昧だった気がしますので、この機会にちゃんと学習されることをおすすめします。
※ 過去ログを見なおしてみましたが何度かバイナリデータと文字列をちゃんと理解する様に指摘されています。

理解のため標準ライブラリのstrcmpなどを使わずに自分で関数を作るのも良いと思います。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月20日(金) 16:33
by helloworld1853
ありがとうございます。

http://homepage1.nifty.com/toshio-k/prog/c/string.html

ここのサイトを見て勉強します。
(ほかにもここのサイトがいいよ というのがありましたら お願いします。)

最後に 受信用のsocketと送信用のsocketを一緒に使っても

大丈夫なのでしょうか。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月20日(金) 18:17
by softya(ソフト屋)
まず、ココとかでしょうね。

「ポインタ」 から4ページ
http://www9.plala.or.jp/sgwr-t/c/sec10.html
「ポインタ虎の巻」
http://www.nurs.or.jp/~sug/soft/tora/index.htm
「苦しんで覚えるC言語」 ここの13から14章。
http://9cguide.appspot.com/

>最後に 受信用のsocketと送信用のsocketを一緒に使っても大丈夫なのでしょうか。

受信と送信socketが分かられているならOKだと思います。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月20日(金) 19:46
by helloworld1853
どんなかんじで分けるのでしょうか。

connect関数からsocketが得られるのですが、

このsocketを別のsocketに代入して
(たとえば、socket=socket_recv というように)

使えばいいのでしょうか。

それとも何か別の処理をしなければならないのでしょうか。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月20日(金) 21:06
by softya(ソフト屋)
チャットプログラムはTCPのサーバ・クライアント型なのでしょうか?
与えられる情報が断片すぎて答えにくいですが、connectでサーバ接続するTCP型なら1つのソケットで良いと思います。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月20日(金) 21:33
by helloworld1853
説明が不十分だったので 説明します。

チャット プログラムは

TCP で クライアントとサーバがあり、

クライアントとサーバとの間で接続が確立できたら

チャットがスタートします。

クライアントが文字列を送信したら

サーバ側が受信して今度はサーバ側が文字列を送信し、

クライアント側が受信する・・・を繰り返します。

このまま同じsocketを使用してプログラムを作るのですが、

ここまでで注意することはありませんか。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月20日(金) 22:53
by softya(ソフト屋)
どのぐらいの事がやりたいか分からないですが、ちゃんとエラー処理も作れば問題ないと思います。
ただ、サーバーが毎回クライアントソケットをshutdownするならクライアントも毎回shutdownしないとダメでしょうね(その部分のコードは無いの推測です)。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月20日(金) 22:58
by helloworld1853
設計上毎回shutdownするのは

あまり好ましくありません。

この問題を回避する方法はありませんか。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月20日(金) 23:23
by softya(ソフト屋)
どうしてshutdownするとマズイ設計が分かりませんがshutdownしなければ良いのでは?
※ 連続して接続したままのアプリをwinsockで書いたことがないので問題があるかも知れません。あるいは問題はないかも知れません。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月21日(土) 00:44
by helloworld1853
シャットダウンすることによって通信量が増えるということはありませんか。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月21日(土) 00:51
by softya(ソフト屋)
helloworld1853 さんが書きました:シャットダウンすることによって通信量が増えるということはありませんか。
まぁ、接続を切るんですから少しは通信はありますね。FIN→ACK
どんな応答要求の厳しいチャットアプリを作るか存じませんがTCPである以上は通信の負荷はUDPより多くなります。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月21日(土) 01:01
by helloworld1853
その程度なのですね。

わかりました。ありがとうございます。

これで一通りの疑問は解決しました。

softyaさん、Dixqさん ありがとうございます。

Re: チャットプログラムを作っているのですが、躓いています。

Posted: 2012年7月21日(土) 01:02
by helloworld1853
ボタン押し忘れました。

いろいろと ぼーとしていますが これからもよろしくお願いします。