ソケット通信について

解決


むとんぼ  2006-04-13 14:42:35  No: 61211  IP: 192.*.*.*

C言語で書かれたアプリに対して、クライアントのマシンからソケット通信を使って、幾つかの伝聞を受け取る又は、サーバーマシン側からクライアント側に伝聞を送る方法についてどなたか教えていただけないでしょうか?

編集 削除
Haru  2006-04-13 14:55:44  No: 61212  IP: 192.*.*.*

質問が漠然としすぎです。
なにがわからないんですか?

編集 削除
むとんぼ  2006-04-13 15:46:46  No: 61213  IP: 192.*.*.*

すいません、
ソケット通信の方法自体わかりません。
なにかサンプル的なものありますでしょうか?

編集 削除
Haru  2006-04-13 16:25:06  No: 61214  IP: 192.*.*.*

Googleで検索すればたくさん見つかります。

編集 削除
むとんぼ  2006-04-14 11:23:15  No: 61215  IP: 192.*.*.*

サーバー側を考えていますのでネットより以下の
サンプルプログラムを入手して作成しています。
ですが内容としまして、クライアントがサーバに接続し、1秒ごとにメッセージを送信するというプログラムになっています。実際に私が行いたいことはいか構造体の情報をソケット通信で取得しその情報によって処理を行いたいと考えています。
また、クライアント側にも以下構造体の情報を変更してソケット通信を行いたいと考えています。どのように送信、受信を行えばよいのでしょうか?教えていただけないでしょうか?

Typedef struct {
  WORD  wVer;  
  WORD  wCmd;  
  WORD  wRsp;
  WORD  wDmy1:
}PrcHead_t, *LPPrcHead;

********************ここからサンプルプログラム
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#define BUFFER_SIZE 256

int
main() {
  /* ポート番号、ソケット */
  unsigned short port = 9876;
  int srcSocket;  // 自分
  int dstSocket;  // 相手
  /* sockaddr_in 構造体 */
  struct sockaddr_in srcAddr;
  struct sockaddr_in dstAddr;
  int dstAddrSize = sizeof(dstAddr);
  /* 各種パラメータ */
  int numrcv;
  char buffer[BUFFER_SIZE];
  /************************************************************/
  /* Windows 独自の設定 */
  WSADATA data;
  WSAStartup(MAKEWORD(2,0), &data); 
  /* sockaddr_in 構造体のセット */
  memset(&srcAddr, 0, sizeof(srcAddr));
  srcAddr.sin_port = htons(port);
  srcAddr.sin_family = AF_INET;
  srcAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  /* ソケットの生成 */
  srcSocket = socket(AF_INET, SOCK_STREAM, 0);
  /* ソケットのバインド */
  bind(srcSocket, (struct sockaddr *) &srcAddr, sizeof(srcAddr));
  /* 接続の許可 */
  listen(srcSocket, 1);
  /* 接続の受付け */
  printf("Waiting for connection ...\n");
  dstSocket = accept(srcSocket, (struct sockaddr *) &dstAddr, &dstAddrSize);
  printf("Connected from %s\n", inet_ntoa(dstAddr.sin_addr));
  /* パケット受信 */
  while(1) {
    numrcv = recv(dstSocket, buffer, BUFFER_SIZE, 0); 
    if(numrcv == 0 || numrcv == -1) {
      status = closesocket(dstSocket); break;
    }
    printf("received: %s\n", buffer);
  }
  /* Windows 独自の設定 */
  WSACleanup();
}

編集 削除
επιστημη  2006-04-14 11:55:53  No: 61216  IP: 192.*.*.*

通信するデータの形状がどうであれ、送受信の方法に変わりはありませんから、
呈示されたサンプルほとんどそのままでいいと思います。

てゆっか、何がわからんのか掴めないんですけど。
接続が確立してしまえばファイルに対する読み/書きと大差ありません。

編集 削除
KING・王  2006-04-14 12:44:42  No: 61217  IP: 192.*.*.*

>いか構造体の情報をソケット通信で取得しその情報によって処理を行いたいと考えています。

send()およびrecv()で送受信されるデータ部分にその構造体を格納して、送受信し、
その後は、受信したデータの中身を見て、適宜、処理を行なえばよいのでは?

επιστημηさんがかかれているように、bind()やlisten()、accept()、connect()等の
接続を確立する必要はありますが、その後のほとんどファイルの読み書きと同じで、
recv()がほとんどfread()に相当するような感じです。

ただし、ファイルと異なり、recv()する前に、相手側がsend()しておく必要がありますが・・・

例えば、こんな感じ
---送信側---
PrcHead_t Data;
// Dataにデータを設定
ret = send( socket, (char*)&Data, sizeof(Data), 0 );

---受信側---
LPPrcHead pData = (LPPrcHead)calloc( sizeof(PrcHead_t) );
ret = recv( socket, (char*)pData, sizeof(PrcHead_t), 0 );


#ただし、send()やrecv()は指定したサイズを1回で送受信できるとは限らないので、
#送受信したサイズを確認して、必要に応じて、残りを送受信する必要があります。
#たしか、ここで以前にもそんな質問があったはずです。

編集 削除
むとんぼ  2006-04-14 20:21:01  No: 61218  IP: 192.*.*.*

ありがとうございました
かいけつしました

編集 削除
え?  2006-04-14 20:34:10  No: 61219  IP: 192.*.*.*

>かいけつしました
どうやって?

掲示板を使っている以上、どう解決したか報告するのは義務ではないでしょうか?

編集 削除