掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
マルチスレッドプログラミングについて (ID:63615)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
こんにちは。 初めて投稿させていただきます。 私は、VC++.NETを用いてコンソール上でUDPソケットプログラミングを行なっています。 UDPには、再送を行なう機能がないためUDPを用いて再送を行なうアプリケーションを構築しています。 ネットワーク構成は、送信側と受信側です。 以下がプログラムです。 このプログラムは、パケット送信スレッドおよびパケット受信スレッドで構成されています。 (送信スレッド) fread関数により1024Byteずつバイナリデータを抽出し、sprintf関数にて通番をふかし、PktBuffへ格納(①部)。そして、sendto関数にてパケットを送信しています。 (受信スレッド) recvfrom関数により、受信側で取得できなかった番号を受信しています。 [質問事項] 送信スレッドで、送信したパケットが100個になると一時的に送信スレッドを停止させます。 そして、受信スレッド内に通番があれば再送スレッドを生成し、なければ、送信スレッドを再開させる。 というプログラムを考えているのですが、これはCreateEvent関数を用いる事で可能でしょうか? また、送信スレッド内で構造体を用いて100パケット格納(②部)しているのですが、受信スレッドから送信スレッドへアクセス可能でしょうか? よろしくお願いします。 #ifndef Boolean #define Boolean int #endif #ifndef TRUE #define TRUE 0 #endif #define SEND_DATA_SIZE 1024 //構造体 struct SPkt{ UINT SeqNum; char SPkt_Buf[1500]; }SendPkt; //グローバル関数 HANDLE hEvent[3]; //受信側からの通番受信部 Boolean feedback_packet(){ //recvfromにより通番を受信 recvfrom(); //★受信側で取得できなかった通番を受信。 return(TRUE); } //受信スレッド unsigned __stdcall Feedback_Pkt(void *lpx){ if(feedback_packet() == TRUE); SetEvent(hEvent[1]); return 0; } //パケット送出部 int udpdatasend(char *PktBuff){ //sendtoにより受信 sendto(PktBuff); return 0; } //パケット処理 int udpsending(){ int n,s; int SeqN = 0; char PktBuf[1024],PktBuff[1024]; struct SPkt Pkt_Array[100]; //fread関数にて、1024Byteずつバイナリデータを取り出す while((n = fread(PktBuf, sizeof(char), SEND_DATA_SIZE, fp)) != 0) { //通番カウント SeqN++; //①sprintfおよびmemmove関数にて、PktBuffに通番+バイナリデータを格納 s = sprintf(PktBuff,"%d\0",SeqN); memmove(&PktBuff[s+1],&PktBuf[0],n); //②送信データを構造体を用意し、通番とバイナリデータを対にして格納(100個) Pkt_Array[c].SeqNum = SeqN; memmove(&Pkt_Array[c].SPkt_Buf[0],PktBuf[0],n); udpdatasend(PktBuff); if(SeqN%100==0){ //★Send_Pktスレッド一時停止 } } return 0; } //送信スレッド unsigned __stdcall Send_Pkt(void *lpx){ udpsending(); WaitForSingleObject(hEvent[1],INFINITE); SetEvent(hEvent[2]); return 0; } int main(){ HANDLE hTh[2]; unsigned int thID[2]; hEvent[0] = CreateEvent(NULL, TRUE, FALSE, "CH0"); hEvent[1] = CreateEvent(NULL, TRUE, FALSE, "CH1"); hEvent[2] = CreateEvent(NULL, TRUE, FALSE, "MAINEVENT"); //Send_Pktスレッド生成 hTh[0] = (HANDLE)_beginthreadex(NULL, 0, Send_Pkt, NULL, 0, &thID[0]); //Feedback_Pktスレッド生成 hTh[1] = (HANDLE)_beginthreadex(NULL, 0, Feedback_Pkt, NULL, 0, &thID[1]); WaitForSingleObject(hEvent[2], INFINITE); //スレッド終了 for(i=0;i<2;i++) CloseHandle(hTh[i]); }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.