• ベストアンサー

ソケット通信の送受信方法

ソケット通信を用いて、簡単な通信ゲームを作成しようと思っています。 メッセージ送信時に構造体を送りたいと思っているのですが どう指定してもエラーになってしまい、作業が止まってしまっています。 下記の様な指定の仕方ですと、エラーは起きないのですが・・・ char buf[256] = { 0 }; send(clsock,buf,256,0); typedef struct{ int a; int b; }sample; 上記のような構造体を送信、受信する場合は、どのように指定すれば良いのでしょうか? 知っている方いましたらご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hjoshua
  • ベストアンサー率66% (6/9)
回答No.2

'send':2番目の引数を'sample *'から'const char*'に変換できません。 とエラーが出てしまいます。 >>> typedef struct{ int a; int b; }sample; sample A; send(clsock,(char*)&A,sizeof(sample),0); というふうに強制的に型変換してやれば、問題ないでしょう。

その他の回答 (1)

  • furyfox
  • ベストアンサー率56% (58/103)
回答No.1

typedef struct{ int a; int b; }sample; sample A; send(clsock,&A,sizeof(sample),0);

maxpower-zero
質問者

補足

ご返答ありがとうございます。 早速試して見ましたところ 'send':2番目の引数を'sample *'から'const char*'に変換できません。 とエラーが出てしまいます。 この場合はどうすれば良いのでしょうか? 遅くなりましたが、動作環境は WinXp Pro:VC++.netです。

関連するQ&A

  • ソケット通信で大容量のメールの場合送信されません

    質問です smtpクライアントからtcpでメール送信するプログラムを組んだのですが、 添付ファイルのサイズが大きいもの(500000行を超えるような)を1行ずつsendメソッドで送信すると送信先で受信できません。 400000行まではいくのですが… sendではエラーは返っておらずパケットは送られてる様です。 パケットダンプをとってみたのですが、メールサーバから応答は返ってきていました。 filein.open("test.eml"); if (filein.fail()){ return -1; } if((soc = ConnectHost("testhost","smtp",25)) == -1){ return -1; } send_buf = new char[BUFSIZ]; sprintf(send_buf,"MAIL FROM:<%s>\r\n","test@test.test"); SocketSend(soc,send_buf,strlen(send_buf)); sprintf(send_buf,"RCPT TO:<%s>\r\n","test2@test.test"); SocketSend(soc,send_buf,strlen(send_buf)); sprintf(send_buf,"DATA\r\n"); SocketSend(soc,send_buf,strlen(send_buf)); ss = new char[1024]; while (filein.getline(ss,1024)){ sprintf(send_buf,"%s\r\n",ss); SocketSend(soc,send_buf,strlen(send_buf)); ←ここでループ } delete ss; sprintf(send_buf,"\r\n.\r\n"); SocketSend(soc,send_buf,strlen(send_buf)); SocketRead(soc,send_buf); delete send_buf; filein.close(); if(SocketClose(soc) == -1){ return err; } int SocketSend(int soc,char* buff,int nbytes) { register int nleft,nwritten; char* p = buff; nleft = nbytes; while(nleft > 0) { nwritten = send(soc,p,nleft,0); if(nwritten <= 0){ return nwritten; } nleft -= nwritten; p += nwritten; } return 0; } int SocketClose(int soc) { int ret; if(close(soc) == -1){ return -1; } return 0; } int SocketRead(int soc,char* buff) { int rbyte; rbyte = read(soc,buff,strlen(buff)); return 0; } 上記で問題になっていそうなところがあれば 教えてください。。 よろしくお願いします。

  • winsockを使った通信方法

    送信側 #include <winsock2.h> #include <string.h> int main() { WSAData wsaData; SOCKET sock; struct sockaddr_in addr; int len; typedef struct recv { char Name[32]; int Flag; } RECV; RECV send; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); strcat(send.Name, "ABC"); send.Flag=12; len=sizeof(send); sendto(sock,(char *)&send,len, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); system("pause"); return 0; } 受信側 #include <stdio.h> #include <winsock2.h> #include <string.h> int main() { typedef struct rcv { char Name[32]; int Flag; } RECV; WSAData wsaData; SOCKET sock; struct sockaddr_in addr; int len; RECV rcv; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.S_un.S_addr = INADDR_ANY; bind(sock, (struct sockaddr *)&addr, sizeof(addr)); len=sizeof(rcv); recv(sock,(char *)&rcv, len, 0); printf("%s [%d]\n",rcv.Name,rcv.Flag); closesocket(sock); WSACleanup(); system("pause"); return 0; } winsockを使ったUDP通信プログラムで構造体データを送る事が出来ないのですが どこに誤りがあるのでしょうか? コンパイルは通ってるのですが、送信側を起動しても受信側で受け取ることが出来ていない状況です。

  • ソケットプログラミングについて

    こんにちは。 以前、この掲示板に質問させていただいた者です。 送信側から受信側へWinsockを利用し、jpeg,mpegファイルを送信したいのですが、プログラムを実行すると強制終了されてしまいます。以下に主要部分を記述します。 [送信側] FILE *fp; char fname[100]; printf("読み込み用ファイルを入力して下さい:"); scanf("%s",fname); if((fp = fopen(fname,"rb")) == NULL){ printf("入力ファイルをオープンできない。\n"); exit(1); } char send_buf[1025]; int nRet; int n; while(n = fread(send_buf,1,1024,fp) != -1){ sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); } fclose(fp); closesocket(theSocket); [受信側] FILE *fp; char fname[100]; printf("書き込み用ファイルを入力して下さい:"); scanf("%s",fname); if((fp = fopen(fname,"wb")) == NULL){ printf("出力ファイルをオープンできない。\n"); exit(1); } char Recv_buf[1025]; char size; SOCKADDR_IN saClient; while(1){ size = recvfrom(theSocket,Recv_buf,1024,0,(LPSOCKADDR)&saClient,&nLen); fwrite(Recv_buf,size,1,fp); } fclose(fp); closesocket(theSocket); 受信側を先に起動し、送信側を起動。送信側で1024バイトずつ送信し、受信側でwhileの無限ループを用いて送信側からのデータを受信するプログラムにしたつもりです。しかし、送信側で読み込みファイルを指定すると強制終了されてしまいます。ファイルオープンの仕方がおかしいのでしょうか?また、上記のプログラムでは1024バイトずつ送信できるようになっていますでしょうか? よろしくお願いします。

  • C言語のsendとrecv

    C言語でクライアントとサーバのプログラムを作りたいのですが、かなりの初心者なので、とりあえず練習用として、クライアント側に整数を入力すると、サーバ側でその整数を二乗して、結果をクライアント側に返すという簡単なプログラムを作ろうと思いました。 ソケットの作成、通信ドメインの指定等は、参考書を見ながら(というか、ほとんど丸写しみたいな感じなんですが…)、なんとかできたんですが、sendとrecvで整数を送受信するにはどうすればいいのかが分かりません。 私が持っている参考書には、 int send(SOCKETS const char FAR *buf int len int flags); int recv(SOCKETS char FAR *buf int len int flags); とあるのですが、const char FAR *buf、int len、char FAR *bufのところがよく分からないのです。 例えば、a=1000を送信したい場合、aはchar型ではないのでsendでは送れないのですか? ほんと初心者ですいませんが、どなたか教えてください。 よろしくお願いします。

  • winsockで送受信されるデータの効率的な扱い方について

    Winsock2.hを使って通信プログラムを作っています。 座標などのパラメータを短いスパンで送受信して処理をするものなのですが、 send()で送れるデータ型がchar*型ということなのでパラメータをwsprintf()を使って SOCKET s; int x=100; int y=100; int z=100; char buf[16]; wsprintf(buf,"#%04d#%04d#%04d",x,y,z); send(s,buf,strlen(buf),0); のようにして送信して、受信されたデータはstrtok()で区切りながらそれぞれ格納しています。 SOCKAT s; int x,y,z; int nResult; char buf[16]; char *tp; nResult = recv(s,buf,sizeof(buf),0); tp = strtok(buf,"#"); x=atoi(tp); tp = strtok(buf,"#"); y=atoi(tp); tp = strtok(buf,"#"); z=atoi(tp); という感じなのですが、パラメータが増えていくにつれなんというか冗長というか、 もうちょっと賢いやり方があるような気がしていろいろ調べてはみたものの… あまりデータの扱い方に関しての解説が見つからなかったので質問させていただきました。 ということで、他に複数の変数を纏めて送受信して処理する手法(できれば高速に)をご存知でしたらご教授お願いします。

  • Winsockでの送受信についての質問

    本日はじめてOKwaveを利用させていただきます、Nimameです。 以後よろしくお願いします。 本日はwinsockの送受信について質問させていただきたく、投稿しました。 現在winsockを利用したS/Cのネットワークプログラムを組んでいるのですが、 送受信の時、同PC内だとうまくいき、外部PCからだとうまくいかずに困っています。 送受信の際(recv, send)の後にSleep(10)を入れるとうまくいくことから ・パケットが最後まで送信しきれていない ・パケットが最後まで受信しきれていない の以上が原因かと考えています。 そこでサイズ分最後まで送受信をする関数を用意したのですが、 これがどうにもうまく働いていないようでやはりうまくいきません。 -------------------------------------------------------- // 最後まで送りきる int Send(SOCKET s, char *buf, int len) { int endsize; int r; char* sendptr = buf; // 送信する先頭アドレスを取得 // 確実に全てのパケットを送信する while(endsize < len) { r = send(s, sendptr, len - endsize, 0); // 送信結果がエラーなら終了 if( r <= 0 ) return r; sendptr += r; endsize+= r; } sendptr = NULL; return endsize; } -------------------------------------------------------- // 最後まで受信する int Recv(SOCKET s, char *buf, int len) { // 受信データアドレスの設定 char* recvptr = buf; int endsize= 0; // 受信データを1つぶん読み込むまでループする while( endsize < len ) { // 未受信データアドレスに実際にデータを読み込む int r = recv(s, recvptr, len-endsize, 0); // エラーだったら終了する if( r <= 0 ) return r; recvptr += r; endsize+= r; } strext(buf, buf, 0, len); recvptr = NULL; return endsize; } -------------------------------------------------------- 以上なのですが、おかしな点や、改善点などありましたら お教えいただけたら幸です。

  • ソケット通信の受信処理について(マルチスレッド)

    今私はVisual Studio2010 C++で ソケット通信のプログラムをしているのですが、 クライアントから送ってくる文字をうまく受信できません。 接続は出来ています。 _beginthreadexでスレッドを作っています。 以下が受信の処理のスレッドになっています。 unsigned int __stdcall ThSend(void* pArg) {     CSocket_ServerDlg* pDlg = (CSocket_ServerDlg*)pArg; while(1){       char buf[256]; /* 受信するバッファ */ int buf_len; /* 受信したバイト数 */ buf_len = recv(pDlg->m_NewSoc,buf , RECVSIZE - 1, 0); if (buf_len != SOCKET_ERROR ){       buf[buf_len] = '\0'; /* 受信したバッファの後ろにNULLを付加する */       }       pDlg->m_xvEditResult += _T("Recv : ");       pDlg->m_xvEditResult += buf;       pDlg->m_xvEditResult += _T("\r\n"); } return 0; } "m_"はメンバ変数です。 以下がスレッド作成のソースになっています HANDLE hForth; unsigned int nForthID; hForth = (HANDLE)_beginthreadex(NULL, 0, ThSend , this, 0, &nForthID ); なぜ受信できないのか分からない状態です。 ではよろしくお願いします

  • ソケットプログラミング(配列について)

    こんにちは。 この掲示板に、大変お世話になっています。 私は送信側から受信側へWindows上でUDPソケットを利用し、約3MByteのmpegデータを、1024Byteずつパケットに分割し送信しています。以下に、送信側のプログラムの概要を示します。 [送信側] ・配列[1025]確保し、fread関数を用いてファイルの読み込みを行い、sendto関数で受信側へ送信。 ・1024Byteずつ送出できているかを表示。 ・送出した1024Byteのパケット数を表示。 int n; int Num_n = 0; char send_buf[1025]; while((n = fread(send_buf,1,DATA_SIZE,fp)) != 0){ Num_n++; //1024Byteずつ送出できているかを表示させています printf("n:%dバイト\t",n); sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); } //送出したパケット数を表示させています printf("%d個のパケットを送出しました\n",Num_n); <質問内容> 約3MByteのmpegを1024Byteずつ送信した場合、最後のパケットは、「n:4バイト」と表示されました。残りの1020バイト分は、どのような形で送信されているのでしょうか?確保した配列内に何も入っていない形で送信されているのでしょうか? また、私は送信側と受信側でスループットの計算を以下の式から算出しています。 送信側 (送信したパケット数×1024×8)/送信に要した時間 受信側 (受信したパケット数×1024×8)/受信に要した時間 送信したパケット数は3041個。 送信に要した時間=受信に要した時間です。 この場合、送信側での計算として・・・ (3041×1024×8)/送信に要した時間とするのか (3040×1024×8)+4/送信に要した時間とするのか どちらが正当なのでしょうか? よろしくお願いします。

  • VC++でのソケット通信について

    いつも拝見させていただいております。 このたびは、皆様のお知恵をお借りしたく質問させていただきました。 ソケット通信を行いたく、以下のサンプルを作成いたしました。 この関数を5回ループさせると、エラーが起きてしまいます。 エラーコードは10061です。 解決方法をご存知の型が降りましたら、 ご教授ください。 よろしくお願いいたします。 (VC++での開発です) extern "C" __declspec( dllexport ) bool __stdcall ssl_SockOpen(LPSTR p_c_IpAddress, LPSTR p_c_PortNum) { struct sockaddr_in addr; //socketの情報を代入する構造体 WSADATA p_obj_SockInit; //Windows Sockets初期化変数 //■ Windows Socketsを初期化する WSAStartup( 0x0101, &p_obj_SockInit ); //■ ソケット確保 if( (g_obj_Socket = socket( AF_INET, SOCK_STREAM, 0 )) < 0 ){ pMsg = "ソケットの確保に失敗しました。"; return false; } //■ ソケットの情報を入れる memset( &addr, 0, sizeof( addr ) ); //構造体addrの初期化 addr.sin_family = AF_INET; //AF_INETを指定 addr.sin_port = htons( atoi( p_c_PortNum ) ); //ポートを指定 addr.sin_addr.s_addr = inet_addr( p_c_IpAddress ); //inet_addr()により指定されたIPを構造体に代入 //■ 接続要求を行う▼▼▼▼ここでエラー!!▼▼▼▼ if( connect( g_obj_Socket, (struct sockaddr *)&addr, sizeof(addr) ) < 0 ){ pMsg = "接続要求に失敗しました。"; int i; i = GetLastError( ); return false; } return( true ); }

  • ソケット通信の送受信遅延

    MFCのCAsyncSockを使ってクライアントとサーバでメッセージの送受信をしています サーバからsend()でメッセージを送信し クライアントはOnReceive()の中でreceive()し メッセージを受信後、応答をsend()で返信します これを10msec間隔で行っているのですが ランダムに送信か受信で300msec前後の遅延が発生します なぜでしょうか? ちなみにソケットオプションで「TCP_NODELAY」を設定しています かなり困っています 気になることでも何でもいいので是非アドバイスをお願いします

専門家に質問してみよう