ソケットプログラミングに関する質問です
最近ソケットプログラムに興味があり、勉強をしているのですが、
手始めにと下記の2つのプログラムをそのまま記述し
http://cs.baylor.edu/~donahoo/practical/CSockets …
http://cs.baylor.edu/~donahoo/practical/CSockets …
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で引っ張ってくればいいと思ったのですが、そういうわけでもないのです。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
ありもののクラスやライブラリを使う前に一度APIを叩くことを地道に実験されたほうが利益になるかと。
ソケットの場合は特に。以下に入門になかなか良いあきみちさんのサイトを載せておきます。もし開発環境がWindowsでない場合でもページ内にLinux用のものがあり有用です。
http://www.geekpage.jp/programming/winsock/
そしてもうすこし突っ込んだことを勉強してソケットオプションや、ソケット通信の仕様などを知るには以下のサイトが有名です。サンプルもシンプルに作られていて参考になりますが、残念ながらマルチスレッドとの併用などがあまり詳しく書かれていないのでご自分で実験されてみるとよろしいかと。このサイトはWinsockがメインで説明されていますがLinuxなどと共通している内容が多いので使えます。ただLinuxとWindowsのソケット関数の実装は違うそうです。
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
No.1
- 回答日時:
のページですかね。
# ソースコードだけのリンク貼られても、前提が判りません。
# ましてや、掲示されたリンクでは「改造前のHandleTCPClient()」がどんなモノかも判りません。
>引数に問題があるとエラーが出て先へ進めません。><
TCPEchoServer.cで使用しているHandleTCPClient()は「int型の引数1つ必要」と宣言されています。(TCPEchoServer.cの11行目)
コールしている箇所で貴方の改造したHandleTCPClient()を使用しようとしても、引数の数が合いませんのでコンパイルエラーとなるのでしょう。
>void HandleTCPClient(int clntSocket, int echoClntAddr) /* TCPクライアント関数処理 */
>struct clintIP echoClntAddr; /* クライアントのIPを取得 */
仮引数とローカル変数で同じ変数名は使用できません。
というか…後者は構造体clintIPという型のechoClntAddrという名前のローカル変数の宣言なんですが…
もしかしてclintIPというローカル変数にechoClntAddrを代入のつもりで書いていますか?
>if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE,clintIP,0)) < 0)
の使用例を見ると。
# ついでにソケット関数のrecv()は5つの引数取らないのでは?
# エラーはこっち…かな?
# エラーメッセージは下手な意訳なんぞせずに、そのまま記述しましょう。
さて、そうすると…clintIPというローカル変数はどんな構造体なんでしょうか???
なんというか、いろいろダメです。
# TCPEchoServer.cからはオープン済みのSocket番号のみ通知されるので、そこからクライアント側のIPアドレスやポート番号を取得するのは一手間かける必要があるでしょう。
# 具体的には調べていませんけど。<一手間について
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
相手のIPアドレスを取得する方法
-
ソケットでクライアントのipア...
-
Java(クライアント)とC言語(サ...
-
UDP通信(SNMP)したいが、うま...
-
Socket通信の0バイト受信について
-
iアプリでクイズのプログラムを...
-
VB6のwinsockでconnectできない
-
ネットワークプログラミング ...
-
Winsockプログラムの初歩的質問...
-
ソケットのクローズについて
-
TCP/IP通信時のサーバーからの受信
-
UDP通信する時に、相手にどうや...
-
クライアントソケットMACアドレ...
-
ラズパイでのシリアル通信、音...
-
メールサーバへの接続タイムア...
-
Macターミナルで実行中のプログ...
-
explorer.exeが異様にメモリを食う
-
家電製品の電力周波数を変える機械
-
エクセルVBAでクリップボード内...
-
プログラミング ソースコード
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
Winsockで接続待ちタイムアウト...
-
recv関数でフリーズしてしまう
-
VB6のwinsockでconnectできない
-
UDP通信する時に、相手にどうや...
-
ソケットのクローズについて
-
エクセル VBA でのCOMポート...
-
ソケットのrecvの戻り値が0
-
UdpClient 送信元のIPアドレ...
-
Socket通信の0バイト受信について
-
WinSockでの通信プログラムがう...
-
同じLAN内パソコンのIPアドレス...
-
ソケット通信 同じポート番号...
-
VC++でのソケット通信について
-
Connectエラーが出てしまう・・...
-
CreateFile関数でCOMポートが開...
-
VB6‥ソケットについて
-
Winsockを使わずにVBでSocketを...
-
SIPがNATを越えられない理由
おすすめ情報