ページ 1 / 1
windows上で標準入力と受信の両立
Posted: 2011年12月31日(土) 10:57
by ハッスル
windows APIを使用して、DOS窓からの標準入力とクライアントから受信した文言を表示するソフトを作成しています。DOS窓から入力した文言を表示させる方法が分かりません。
unixのようにファイルディスクリプタに0でFD_SETするとクライアントから受信が出来なくなります。
どのようにすれば、selecet待ちしているファイルディスクリプタに標準入力のファイルディスクリプタを追加することが出来るでしょうか?
環境:
windows XP
bcc32 にてコンパイル
Re: windows上で標準入力と受信の両立
Posted: 2011年12月31日(土) 11:28
by YuO
ハッスル さんが書きました:windows APIを使用して、DOS窓からの標準入力とクライアントから受信した文言を表示するソフトを作成しています。DOS窓から入力した文言を表示させる方法が分かりません。
unixのようにファイルディスクリプタに0でFD_SETするとクライアントから受信が出来なくなります。
Windowsには「ファイルディスクリプタ」というものは存在しません。
Windowsが低レベルで扱うものは「ハンドル」です。
非同期入力は,ReadFileでlpOverlappedを指定するか,ReadFileExでコールバックを指定することで行います。
ハッスル さんが書きました:どのようにすれば、selecet待ちしているファイルディスクリプタに標準入力のファイルディスクリプタを追加することが出来るでしょうか?
できません。Windowsにおいて,selectはWinSock専用です。
Re: windows上で標準入力と受信の両立
Posted: 2011年12月31日(土) 18:16
by shiro4ao
設計変更が必要になりますが、
メインスレッドとは別に「受信したら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上で標準入力と受信の両立
Posted: 2012年1月01日(日) 07:49
by ハッスルさん
大変ありがとうございます。
サンプルプログラムを基にソフト変更をして見ます。