winsockについて教えてください。
winsockについて教えてください。
ネットワーク系は初心者なので、理解が遅いと思いますが、お手柔らかに御願いします。
始めは、perlでクライアント側もサーバ側もソケットで通信するプログラムを書いたんですが、
クライアント側のpcはperlが標準装備ではないので、クライアント側だけVC++で書き直そうと、現在しているのですが、うまくクライアント側で受信してくれません。
書いたソースは、
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
#include <cstdlib>
#include <iostream>
#include <fstream>
#define BUFSIZE 256
#define FILENAME "C:\\abc.dat"
int main(void)
{
FILE *fp;
int nRtn;
char fname[BUFSIZE] = FILENAME;
char StrRcv[RECVSIZE];
SOCKET s; //ソケット
//接続するサーバの情報
struct sockaddr_in dest;
//接続するサーバのIPアドレス
//xxx.xxx.xxx.xxxの形式で指定する
char destination[] = "xxx.xxx.xxx.xxx";
char buffer[BUFSIZE];
char send_buf[BUFSIZE];
//ソケット通信の準備
WSADATA data;
WSAStartup(MAKEWORD(2,0), &data);
//接続先(サーバ)のアドレス情報を設定
memset(&dest, 0, sizeof(dest));
//ポート番号はサーバプログラムと共通
dest.sin_port = htons(3001);
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = inet_addr(destination);
//ソケットの生成
s = socket(AF_INET, SOCK_STREAM, 0);
//サーバへの接続
if(connect(s, (struct sockaddr *) &dest, sizeof(dest))){
printf("%sに接続できませんでした\n", destination);
return -1;
}
printf("%sに接続しました\n", destination);
//ファイルの読込み
if((fp=fopen(fname,"r"))==NULL){
printf("ファイルを開けませんでした\n");
exit(1);
}
//ファイルサイズ取得(フルパスで書く)
ifstream ifs(FILENAME, ios_base::binary);
//VC++の場合、peek()で読み込まないとファイルが開かれない
ifs.peek();
streamsize size = ifs.rdbuf()->in_avail();
//ファイルサイズを出力します
printf("size = %d\n",size);
while((fgets(send_buf,size,fp)) != 0){
send(s,send_buf,size, 0);
}
fclose(fp);
//サーバからデータを受信
while(1){
memset(StrRcv, '\0', sizeof(StrRcv));
nRtn = recv(s, StrRcv, (int)sizeof(StrRcv) - 1, 0);
printf("→ %s\n\n", StrRcv);
if(nRtn == 0) break;
if(nRtn ==SOCKET_ERROR){
perror("recvエラーです。\n");
break;
}
}
recv(s, buffer, size , 0);
printf("→ %s\n\n", buffer);
// Windows でのソケットの終了
shutdown(s,2);
closesocket(s);
WSACleanup();
return 0;
}
とこんな感じです。
abc.datの中身はabc。
どこがおかしいかどなたかご教授ください。
お礼
ありがとうございます。 回答を参考に調べて動かしてみたら、できました。 ・winsockにもselectがあります。 ・シングルスレッドで複数のソケットを作成しました。 ・selectを使う事により、別のソケットをブロックすることなく受信が可能なようです。 ソケット数に限界値があるのかどうかは分かりませんが、 取り合えず希望通りの動作が可能なようでした。 (64ソケット/ポートまで正常動作させることができました。) 解決のヒントとなる回答を頂き感謝します。