ベストアンサー ソケットプログラミングにおけるワイド文字の送信方法 2008/08/02 07:58 C/C++におけるソケットプログラミングでのワイド文字の送信はどうすればよいのでしょうか? みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー php504 ベストアンサー率42% (926/2160) 2008/08/02 08:38 回答No.1 char型のポインタにキャストして送信しましょう 質問者 お礼 2008/08/02 09:03 御解答ありがとうございます。自己解決いたしました。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発C・C++・C# 関連するQ&A ソケットプログラミングって?? 現在ソケットプログラミングを勉強していますが、いまいち利点がわかりません。これをつかって自宅サーバーとかって作るんでしょうか?ソケットプログラミングで何ができるんでしょうか?(自宅でやれることってあるのでしょうか?) お願いします。ちなみにLinuxを使ってCで打っています。 ソケットプログラミングについて こんにちは。 私は、ソケットプログラミングを行ってみようとしています。 ソケットプログラミングはほぼ、初めてでして、LinuxソケットかWindowsソケットのどちらを使用すればよいのでしょうか? ソケットプログラミングについて こんにちは。 前回、質問しました「バード」という者です。 ソケットプログラミングについて質問します。 PC1から、jpegやmpegファイルを送信しPC2で受信するというプログラムをC言語で作ってみたいと思っています。 以前、少しだけJAVAプログラミングでPC1(送信側)からPC2(受信側)へデータを送信するプログラムを作ったのですが、作ったプログラムの概要を以下に示します。 [送信側] (ファイルオープン) InputStream in = new FileInputStream(ss); BufferedInputStream bin = new BufferedInputStream(in); ↓ (データを読みsendメソッドにて随時送信) while((c = bin.read(buffer, 0, buffer.length))!=-1){ dPacket = new DatagramPacket(buffer,buffer.length,iAddress,port); dSocket.send(dPacket); } ↓ (ファイルとソケットクローズ) dSocket.close(); [受信側] (ファイルオープン) OutputStream out = new FileOutputStream(args[1]); BufferedOutputStream bout = new BufferedOutputStream(out); ↓ (送信側から来たデータをreceiveメソッドにて受信) while(true){ dPacket = new DatagramPacket(buffer,buffer.length); dSocket.receive(dPacket); } ↓ (ファイルとソケットクローズ) dSocket.close(); 上記に示す様に、ファイルをオープンし、DatagramSocketとDatagramPacketクラスを用いて送受信し最後に、ファイルをクローズするという形式をとっていました。 C言語の場合でも、ファイルオープン→send関数,receive関数等を用いて送信・受信→ファイルクローズという形をとる事ができるのでしょうか?FTPプログラムやエコープログラムを、よく見かけるのですが・・・・ ソケットプログラミング こんにちは。 ソケットプログラミングを勉強していて、音声を送りあえるIP電話らしきものを作ろうとしています。音声のやりとりは何とかできていますが、同時に文字列も送れるようにしたいです。ソケットをもう一つ作ればいいのではないかと思っていますが、実際に書いてみると、recv()の部分がうまく書けません。 音声データの送受信の部分は: while(1){ n=recv(sock,data1,N,0); //受信 if (n== -1){perror("recv");exit(1);} if(write(dsp, data1,n)==-1){perror("write"); exit(1);} //スピーカーから出力 n=read(dsp,data,N); //マイクから入力 if (n== -1){perror("read");exit(1);} if(send(sock,data,n,0)==-1){perror("send");exit(1});} //送信 } 送信の時は n=read(0,tdata_2,N); send(sock_2,data_2,n,0); のように標準入力から文字列を読み込んで、data_2に格納し、新しく作ったソケットsock_2で送ればいいのですが、受信の時はどうしたらいいでしょうか。recv()をつかって、文字列と音声のデータを違うソケットで受け取って、違う配列に格納する方法があるでしょうか。 つまり、このような感じ(?): n1=recv(sock1,data1,N,0); //音声 n2=recv(sock2,data2,N,0); //文字列 とても悩んでますので、よろしくお願いします!! ソケットプログラミングについて ソケットプログラミング(ネットワーク?)をはじめようと思うのですが(使用する言語はCあるいはC++) その場合のOSとして UNIX、Linux、Windows のどれが適しているでしょうか ちなみに、メールサーバや、APACHの様なHTTPサーバを作れる様にまでなりたいです (その他にもFTP等) ちなみに私はUNIXや、Linuxだと思っていますが、Windows との文法の違いはどれくらいあるのでしょうか WinSock2。ナル文字をソケットに含めるには? C言語を学び始めて間もないのですが、ggってもヒットしなかった疑問があるので質問させていただきます。 用語が間違っていたらすみません。 WinSock2を用いてソケットを送信するプログラムを作っています。 末尾にナル文字のつく内容を、ナル文字含めて送信したいのですが、上手くいきません。 ソケット作成⇒コネクト⇒ _snprintf(buf, sizeof(buf), "XXXXX\0\0"); send(sock, buf, (int)strlen(buf), 0); 送信部分はこのようになっています。 パケットモニタで監視してみたところ、「XXXXX」が送信されていました。 Perlで同様なものを組んだところ、「XXXXX\0\0」が送信されています。こちらが送りたい内容なのですが・・・ 確かにCではナル文字を文字列の末尾と認識しますが、 ナル文字も文字列の一部として一緒に送信させてあげることはできますか? わかりにくい説明ですみませんが、宜しくお願いします m(__)m UDPのソケットプログラミング ソケットプログラミングでの質問です. 初心者です. UDPクライアントで sock = socket(PF_INET,SOCK_DGRAM,0) でUDPソケットを生成した後に bind()なしで,UDPサーバ宛にsendto() を行った場合, サーバのrecvfrom()でクライアントの IPアドレスとポート番号が受け取ることができると思いますが ここでのIPアドレスはクライアントのアドレスで, ポート番号は他のクライアントの他ソケットが使用していないポート番号 が受け取ることができると考えてよろしいですか? クライアントのsendto()で自動的にポート番号が割り当てられるが, クライアントが,どのポートから送信したのかを知る方法はないですか? ソケットプログラミングについて 前回、ここで質問しましたが質問内容がきちんと記述できていなかったので、もう一度質問させていただきます。 [行いたいこと(概要)] PC1(送信端末)に保存されているファイル(jpeg,mpegファイル等)をUDPを使ってPC2(受信端末)へ送信し、PC2側でファイルを開くということです。 [現在、試していること] インターネットや本でもエコープログラミングしかサンプルプログラムがなく、実際どのようにすればよいか分かっていない状況です。以下に、プログラム内容を示します。 PC1(送信端末側) //ファイル名を入力し、ファイルをバイナリ形式で読み込み、sendto関数を用いて送信する。 FILE *fp; printf("送信ファイル名を入力:"); scanf("%s",&fname); if((fp = fopen(fname,"rb")) == NULL){ fprintf(stdout,"ファイルを開く際にエラーが発生しました\n"); exit(1); } while(!feof(fp)){ data = fgetc(fp) sendto関数を用いて送信する } PC2(受信端末側) //ファイルポインタを用いて、受信ファイル名を記入しバイナリ形式で書き込む。while文は無限ループとし、PC1からのパケットを常時受け取る。 FILE *fp; printf("受信ファイル名を入力:"); scanf("%s",&fname); if((fp = fopen(fname,"wb")) == NULL){ fprintf(stdout,"ファイルを開く際にエラーが発生しました\n"); exit(1); } while(1){ receive関数を用いて受信する。 } 上記に示す様に作ろうと思っているのですが、実際に可能なのでしょうか? ソケットは、Windowsソケット、Linuxソケットどちらでもかまいませんので、よろしければサンプルプログラムも教えていただけないでしょうか? よろしくお願いします。 ソケットプログラミングに関する質問です ソケットプログラミングに関する質問です 最近ソケットプログラムに興味があり、勉強をしているのですが、 手始めにと下記の2つのプログラムをそのまま記述し http://cs.baylor.edu/~donahoo/practical/CSockets/code/TCPEchoClient.c http://cs.baylor.edu/~donahoo/practical/CSockets/code/TCPEchoServer.c TCPEchoClientプログラムから送信した英数字をTCPEchoServerがキャッチして TCPEchoClientの方へ送り返すプログラムを作ってみました。 その後、応用として手始めにTCPEchoClient側の送信元IPアドレスと送信した文字列 ex: 192.xxx.xxx.xx 'Hello World!' を送り返すプログラムを作成するために、 同じサイト内にあったHandleTCPClientを下記の通り 改造してみたのですが、引数に問題があるとエラーが出て先へ進めません。>< #include<stdio.h> #include<sys/socket.h> #include<unistd.h> #define RCVBUFSIZE 256 /* 受信バッファのサイズ */ void DieWithError(char *errorMessage); /* エラー処理関数 */ void HandleTCPClient(int clntSocket, int echoClntAddr) /* TCPクライアント関数処理 */ { char echoBuffer[RCVBUFSIZE]; /* エコー文字列のバッファ */ int recvMsgSize; /* 受信メッセージのサイズ */ struct clintIP echoClntAddr; /* クライアントのIPを取得 */ /* クライアントからの受信メッセージ */ if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE,clintIP,0)) < 0) DieWithError("recv() failed"); /* 受信した文字列を送信し、転送が終了していなければ次を受信する */ while (recvMsgSize > 0) /* 0は転送の終了を意味する */ { /* メッセージをクライアントにエコーバックする */ if (send(clntSocket,echoBuffer,recvMsgSize, 0) != recvMsgSize) DieWithError("send() failed"); /* 受信するデータが残っていないか確認する。 */ if ((recvMsgSize = recv(clntSocket, echoBuffer,RCVBUFSIZE, 0)) < 0) DieWithError("recv() failed"); } close(clntSocket); /* クライアントソケットをクローズする */ } 単純にTCPEchoServerの echoClntAddr.sin_addrという箇所が送信元のIPを 引っ張ってきてるからHandleTCPClientの方へ 関数をstructで引っ張ってくればいいと思ったのですが、そういうわけでもないのです。 WinSockを用いたUDP送受信ソケットプログラミングについて こんにちは。 現在、VC++.NETでWinSockを用いたUDPソケットプログラミングを行っています。以下のようなプログラムを作りたいと思っているのですがうまく動作しません。 [概要] A:送信端末 B:受信端末 1.Aから文字列"send"をB端末へ送信。 2."send"を受信した受信端末Bは、A端末へ文字列"ok"を送信。 この1と2の動作を行わせたいと思っています。この場合、A,B端末は送信と受信を行う必要があります。 [問題点(うまくいかない点)] A→Bへ"send"は送信でき、B端末で受信できるのですが、B端末からA端末へ送信できません。B端末で送信できているのか、それともA端末で受信できていないのか?が分からない状態です。 [気づいた点] ポート番号を分ける必要があるのでしょうか?例えば、A→Bへは9000番。B→Aへは9001番という意味です。 送信と受信を行うため、送信・受信で2つのUDPソケットを使用する必要があるのでしょうか?例えば、 s1 = socket(AF_INET, SOCK_DGRAM, 0);←送信に利用 s2 = socket(AF_INET, SOCK_DGRAM, 0);←受信に利用 よろしくお願いします。 ソケットプログラミングによるファイル送信について VC++.NETを利用して、Winsockにてファイル送信プログラムを作成しています。ソケットはUDPを使用しています。 [行いたいこと] A→B端末へ、1024Byteずつバイナリデータ(画像)を送信。 [現在行っていること(A端末側のプログラムの概略)] 1.ファイルオープン 2.fread関数にてバイナリデータの入力(whileにてループ) 3.A→Bへパケットを1024Byteずつ送信。 #define DATA_SIZE 1024 main{ int n; char send_Buf[DATA_SIZE + 1]; if((fp = fopen(fname,"rb+")) == NULL){ printf("ファイルエラー\n"); exit(1); } //nが0でなくなったら、ループを抜ける。 while((n = fread(send_Buf,1,DATA_SIZE,fp)) != 0) { sendto(s, send_Buf, n, 0, (LPSOCKADDR)&addrin, sizeof(addrin)); } } A側でビルドはできますがエラーが発生して実行できません。 よろしければ教えていただけないでしょうか。C言語の基礎もきちんと出来ていないからなのかもしれません・・・>< よろしくお願いします。 プロクシ(多段プロクシ)を使う場合のソケット/HTTPプログラミングについて プロクシ(多段プロキシ)を使う場合のソケット/HTTPプログラミングについて 教えてください。 以下のような構成になっている場合 ┌---┐ ┌-------┐ ┌--------┐ │プログ│⇒│プロクシサーバ │⇒│ターゲットサーバ │ │ラムχ│ │proxy.com:8080 │ │target.co.jp:80 │ └---┘ └------─┘ └--------┘ ソケットプログラミングでHTTPを操ろうとしたら、以下のようになると思います。 1)proxy.comのポート8080をオープンする 2)proxy.comに送信するHTTPリクエストを以下のようにする。 GET http://target.co.jp/index.html HTTP/1.1 Host: target.co.jp:80 (以下略) では、これがプロクシが一段ではなくて多段だった場合、 例えば以下のような構成の場合、どうソケットプログミングを書けばよいのでしょう? ┌---┐ ┌-------┐ ┌-------┐ ┌--------┐ │プログ│⇒│プロクシサーバ │⇒│プロクシサーバ │⇒│ターゲットサーバ│ │ラムχ│ │prxy1.com:8080 │ │prxy2.com:8080 │ │target.co.jp:80 │ └---┘ └-------┘ └-------┘ └-------─┘ HTTPとソケットプログラミングに詳しい方、ご教授ください。 記述言語の想定はCですが、特にJavaでもPerlでも構いません。 よろしくお願いします。 ソケットプログラミングについて_WinSock2 コネクションの確立はlisten関数、accept関数、connect関数を用いて行い、パケット送信の場合は、UDPで送信するというプログラムを作成したいと思っています。 この場合、listen関数、accept関数、connect関数を使用する際は、TCPソケットをオープンするという形になるのでしょうか? それとも、listen,accept,connect関数は、UDPソケットオープンでよいのでしょうか? よろしくお願いします。 ■ソケット通信 送信文字列のオーム返し こんにちは。Win2000、VB6.0(SP5)でソケット通信をしようと思っています。 接続や、送信・受信をすることはできたのですが、受信したとき、送信文字列も受信され困っています。 <例> 送信:abc 受信:abc 12345(期待する返答) という感じです。 期待する返答の文字数が決まっているので、それ以外はゴミとして扱うこともできるのですが、時々ですが、abc12345のように、送信文字列と受信文字列がくっついてきてしまうこともあり、解決するならしたいと思っています。 telnetでテストすると、オーム返しはありません。 あと、相手の装置には、オーム返しの機能はないそうです。 よろしくお願いします。 VC++ 6.0 のソケット通信について VC++6.0にてソケット通信プログラムを作成中(学習中)なのですが 以下のようなソケットのやり取りを想定しています。 A→B→C A←B←C 分かりづらいかもしれませんが、A,B,C三つのプログラムがあり まず、AはBに向けて電文を送信、Bはそれを受信し、Cに電文を送信 Cはそれに対してBへ電文を送信、BはCからの電文を受信しAへ電文を送信 こんな感じになっています。いうなればA,C間の中継器のような役割をBに持たせたいのです。 http://blog.livedoor.jp/akf0/archives/51585502.html ここのソースなどを参考にしてBのプログラムを組んでいるのですが サーバとクライアントでソースが分かれています。 Bはサーバもクライアントも兼ねるような仕様なのですが、この場合に使用するソケットは (1)Aからの受信を行う(待つ)ソケット (2)Cへ送信を行うソケット (3)Cからの受信を行う(待つ)ソケット (4)Aへ送信を行うソケット の4つのソケットが必要になるのでしょうか? ソケットの仕組みがうまく理解できていないので頓珍漢な質問かもしれませんが 回答よろしくお願いします。 ソケットを閉じる操作が・・・ こんばんわ。 winsockを用いてC言語によるソケットプログラミングを行なってます。 ソケットを(SOCKET s1,s2)用いているのですが、両者はローカルで指定しています。しかし、私のプログラミングの記述の仕方が悪く・・・ もし、エラーが発生した場合、s1はクローズできる仕様なのですが・・・s2をクローズできないプログラムになってしまいました。 エラーが発生時、プログラム自体を終了する・・とした場合、ソケットはクローズされるのでしょうか? また、テキストには必ずソケットをオープンした場合クローズする必要があると書いてあるのですが、どういう意味でしょうか? ローカルからグローバル変数へ変更すれば解決できるのですが、グローバル変数へ変更しても大丈夫でしょうか? よろしくお願い致します。 socketプログラミングについて C++でsocketの練習のためにソケットを開き、文字列の送信を行うだけのサーバクライアントプログラムを作成したのですが、どうも上手く動作してくれません。 クライアント→サーバへ文字列を送信する前に、 1.サーバがソケットを開き、9999ポートでアクセスを待つ 2.クライアントがソケットを作成し、サーバの9999ポートにアクセスする 3.クライアントが文字列をサーバへ送信し、サーバが文字列を表示 ということをしたいのですが、2の部分でつまずいています。 プログラムをネットワークに接続されているコンピュータ上で実行すると動作するのですが、(client 192.168.15.17 9999)単独でサーバ・クライアントを起動させ、localhost当てに接続(client localhost 9999)しようとしても「No route to host」と表示されて、接続すら出来ません。 ためしにサーバを起動させている状態で「telnet localhost 9999」とするとどうやらサーバに接続されているようです。 localhostでやる場合は特別なソケット操作が必要になるのでしょうか? ソケットプログラミングで・・ 簡単なソケットプログラムを作ろうとしておりまして、サイトで調べたりしておりましたところ、なんとか分かってきたのですが、ひとつどうしてもわからないことがありますので教えていただけますでしょうか。 ソケットから受信するメッセージの生成のところなんですが、 「WSAAsyncSelect(m_socket,m_hWnd,WM_USER_ASYNC_SELECT,FD_READ | FD_WRITE)」 で、2番目の引数「m_hWnd」がわかりません。 教えていただけないでしょうか?よろしくお願いします。 送信したデータの一部が文字化けしちゃう ソケット通信を利用してデータを送信した際に、 データの一部が文字化けしてしまって困っています。 Cのプログラム内でデータを作成し、 writeを使用してソケットディスクリプタに書き込んでます。 デーモンを介してJavaのプログラムに送信しているのですが、 writeする直前では正常なデータなのに、 Java側で受信すると一部の文字が化けてしまうことがあります。 原因とかぜんぜんわからなくて、かなり困ってるのですが、 わかる方いらっしゃいましたら教えてくださぁ~~~いっ! お願いします!!! ちなみに、送信しているデータは構造体です。 C# ソケット通信で相手に送信できるか事前にチェックする方法 C# ソケット通信で相手に送信できるか事前にチェックする方法 いつもお世話になっております。 チャットのようなプログラムを作ろうと思い、ソケット通信のやり方を勉強しているのですが、どうしてもできないことがあります。 IPアドレスとポートを指定して、その相手先と通信できるかどうかをタイムアウト以外で知る方法です。 また、今回はサーバーを立てずに同じLAN内であればやり取りできるようにしたいと思っています。 できればLAN内の端末すべてに送信といったこともしたいのですが、TCPではできないのでしょうか。 分かる方がいましたらお願いします。
お礼
御解答ありがとうございます。自己解決いたしました。