windows上で標準入力と受信の両立

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ハッスル

windows上で標準入力と受信の両立

#1

投稿記事 by ハッスル » 14年前

windows APIを使用して、DOS窓からの標準入力とクライアントから受信した文言を表示するソフトを作成しています。DOS窓から入力した文言を表示させる方法が分かりません。
unixのようにファイルディスクリプタに0でFD_SETするとクライアントから受信が出来なくなります。

どのようにすれば、selecet待ちしているファイルディスクリプタに標準入力のファイルディスクリプタを追加することが出来るでしょうか?

環境:
windows XP
bcc32 にてコンパイル

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: windows上で標準入力と受信の両立

#2

投稿記事 by YuO » 14年前

ハッスル さんが書きました:windows APIを使用して、DOS窓からの標準入力とクライアントから受信した文言を表示するソフトを作成しています。DOS窓から入力した文言を表示させる方法が分かりません。
unixのようにファイルディスクリプタに0でFD_SETするとクライアントから受信が出来なくなります。
Windowsには「ファイルディスクリプタ」というものは存在しません。
Windowsが低レベルで扱うものは「ハンドル」です。

非同期入力は,ReadFileでlpOverlappedを指定するか,ReadFileExでコールバックを指定することで行います。
ハッスル さんが書きました:どのようにすれば、selecet待ちしているファイルディスクリプタに標準入力のファイルディスクリプタを追加することが出来るでしょうか?
できません。Windowsにおいて,selectはWinSock専用です。

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

Re: windows上で標準入力と受信の両立

#3

投稿記事 by shiro4ao » 14年前

設計変更が必要になりますが、
メインスレッドとは別に「受信したらprintfする副スレッド」をつくってしまえばいいのでしょうか?
そうすれば、
メインスレッドは送信に、
副スレッドはクライアントからの受信に、
集中できるのですっきりするかもしれません。

サンプルを書いたのですが、現在コンパイルできる環境がないので、
はずかしいエラーがあるかもしれません・・・・・

昔つくったtelnetクライアントっぽいものを載せておきます、
クライアントなので適宜接続は変えてください。

このままでは正常な終了方法がないのでCtrl+Cで強制終了してください。

コード:

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

//通信用ソケットは「受信したらprintfする副スレッド」からも見えるようにする。
SOCKET  sock;

//「受信したらprintfする副スレッド」ただ、受信して表示する
DWORD WINAPI ThreadFunc(LPVOID lpvoid ) {
	char    buf[1024];
	while(1){
		         memset(buf,'\0',sizeof(buf));
        		recv(sock, buf,sizeof(buf), 0);
		        printf("%s",buf); 
	}
	ExitThread(TRUE);
}





int main(void)
{  
    WSADATA wsaData;
    struct  sockaddr_in server;
    DWORD dwParam;
    static HANDLE hThread;
    int     i;
    int nBytesRecv;
    char cmd[256];
    char buf[1024];




    WSAStartup(MAKEWORD(2,0), &wsaData);
    sock= socket(AF_INET,SOCK_STREAM,0);
    server.sin_family = AF_INET;
    server.sin_port = htons(5555);
    server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    connect(sock, (struct sockaddr *)&server, sizeof(server));

    //「受信したらprintfする副スレッド」作成
    CreateThread(NULL , 0 , ThreadFunc ,(LPVOID)sock , 0 , &dwParam);

    メインスレッドはひたすら文字をうけとり送信
    while(1){
           printf("\n送信データ->");
	   gets(buf);
	   send(sock,buf,strlen(buf), 0);
	//ループから抜ける方法がありません。
	//「exit」とか「logout」「^Z」「EOF」などぬけるためのルールを作っておいたほうがいいかもしれません。
    }	

	//終了処理が記述されていません
	//本当は丁寧に終了処理してあげてください


}




ハッスルさん

Re: windows上で標準入力と受信の両立

#4

投稿記事 by ハッスルさん » 14年前

大変ありがとうございます。

サンプルプログラムを基にソフト変更をして見ます。

閉鎖

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