VC6.0ソケット通信プログラムの改善方法とは?

このQ&Aのポイント
  • VC6.0でソケット通信の社内の既存のプログラムを改善しております。クライアントより、サーバにソケットで大量に電文を送信した時に、サーバ側の処理が重くなってしまいます。
  • サーバ側では、CLOSE_WAITが大量に出力されておりクライアント側では、FIN_WAIT_2が大量に出力されます。クライアント側のFIN_WAIT_2は、時間が経つと消えるのですが、サーバ側のCLOSE_WAITは残ってしまっております。サーバ側のソケットの受信後の処理に問題があるのではと考えておりますが、何処が問題なのかわからない状態です。
  • ソケット通信プログラムの改善方法に関してご教授いただけると幸いです。
回答を見る
  • ベストアンサー

VC6.0ソケット通信プログラムについて

お世話になります。 VC6.0でソケット通信の社内の既存のプログラムを改善しております。 クライアントより、サーバにソケットで大量に電文を送信した時に、サーバ側の処理が重くなってしまいます。 NETSTATコマンドで確認したところ、 サーバ側では、CLOSE_WAITが大量に出力されており クライアント側では、FIN_WAIT_2が大量に出力されます。 クライアント側のFIN_WAIT_2は、時間が経つと消えるのですが、サーバ側のCLOSE_WAITは残ってしまっております。 サーバ側のEXEを再起動すると、CLOSE_WAITは消えます。 サーバ側のソケットの受信後の処理に問題があるのではと考えておりますが、何処が問題なのかわからない状態です。 コードを以下に記述致します。 WINAPI K010cListener{ /*Winsock初期化*/ WSAStartup(wVersionRequested,&wsaData); /*SOCKET作成*/ fd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) /*ポートの設定*/ addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_family = AF_INET; addr.sin_port = htons(usPortNo); addrlen = sizeof(addr); /*BIND*/ bind(fd,(struct sockaddr*)&addr,addrlen) /*LISTEN*/ listen(fd,0) while(1){ /*ACCEPT*/ fd2 = accept(fd,(struct sockaddr*)&addr,&addrlen) //データ受信 waitReceiveThread(fd2, &rcv_msg); //DBオープン ConnectDB() //DB登録 AddTable(&rcv_msg) //DBクローズ CloseDB() } /*Winsock終了*/ WSACleanup(); } void waitReceiveThread(SOCKET fd, SockRcvMsg *rcv_msg) { while (1) { /*データ受信待ち*/ rcvSize = recv(fd,rcvBuf,sizeof(rcvBuf),0); if (rcvSize <= 0) { continue; } else { /* 返信電文の準備 */ memset(sndBuf,0x20,sizeof(sndBuf)); memcpy(sndBuf ,"RCMORDER00004800000000",22); /* 返信電文の送信 */ send(fd,(char*)sndBuf,sizeof(sndBuf),0); /* バッファの初期化 */ bufsize=0; memset(buf,'\0',sizeof(buf)); break; /*ループを抜ける*/ } } } 恐れ入りますが、ご教授いただければ幸いです。 宜しくお願い申し上げます。

noname#164045
noname#164045

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

  • ベストアンサー
  • towad
  • ベストアンサー率80% (4/5)
回答No.1

waitReceiveThread()においてrecv()の戻り値rcvSizeが0以下の場合、そのコネクションは切断された物として処理するのが妥当だと思います。origin_93様の書かれたプログラムでは無理やりcontinueしてrecv()を繰り返しいるため、切断後の正常動作は期待出来ません。 かなり大雑把ですが、一般的なサーバの動作は下記の流れの様になります。  while (TRUE) {   socket();   bind();   listen();   while (TRUE) {    accept();    while (TRUE) {     ret = recv();     if (ret <= 0) break;     else {      受信処理     }    }   }  } 一番外側のループは要らないかもしれませんが、socket()等の戻り値がエラーだった場合を考慮しています。 複数のクライアントが接続するならば、acceptの後で受信スレッドを生成し、そのままループします。acceptで取得したレシーブソケットは受信処理のループを抜けた所でクローズして構いません。

noname#164045
質問者

お礼

上記コードに、内側のループをbreakし、acceptする前にclose処理を入れてで作成したところ、問題なく動作しました。 誠にありがとうございました。

関連するQ&A

  • 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 ); }

  • TCP/IP通信型電話番号検索プログラムを作りたいです。

    TCP/IP通信型電話番号検索プログラムを作りたいです。 クライアントは以下のようで大丈夫みたいなのですが、サーバの方を修正しなければなりません。 この質問で「TCP/IP通信型大文字・小文字変換プログラム」を発見しました。 サーバー側プログラム #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #define SOCK_NAME "./socket" int main() { int i; int fd1, fd2; struct sockaddr_in saddr; struct sockaddr_in caddr; int len; int ret; char buf[1024]; if((fd1 =socket(AF_INET, SOCK_STREAM, 0)) < 0 ){ perror("socket"); exit(1); } memset((char *)&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr=INADDR_ANY; saddr.sin_port=htons(1357); unlink(SOCK_NAME); if(bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { perror("bind"); exit(1); } if(listen(fd1,5) < 0 ) { perror("listen"); exit(1); } while(1){ len = sizeof(caddr); if((fd2 = accept(fd1, (struct sockaddr *)&caddr, &len)) < 0){ perror("accept"); exit(1); } fprintf(stderr, "Connection established: socket %d used.\n", fd2); while((ret = read(fd2, buf, 1024)) > 0 ){ fprintf(stderr, "read: &s\n", buf); for(i=0; i<ret; i++) if(islower(buf[i])) buf[i] = toupper(buf[i]); if(isupper(buf[i])) buf[i] = tolower(buf[i]); fprintf(stderr, "write: %s\n", buf); write(fd2, buf, 1024); } close(fd2); } close(fd1); return 0; } 先生によると、クライアントは同じもので良いそうです。 誰か、助けて下さい。

  • WinSockでの通信プログラムがうまくいきません

    WinSockでの通信プログラムがうまくいきません。 使用言語はC++とDirectXです。 ローカルでの通信(ルータを介したパソコン同士)はうまくいくんですが、別の場所にあるPCとの通信ができません。 以下実際に使用している関数です。 関数はマルチスレッドで動かしています。 WSADATA mWsaData; SOCKET mSockYou,mSockI; struct sockaddr_in mAddr; struct sockaddr_in mServer; struct sockaddr_in mClient; void CNetwork::Init(){ int err = WSAStartup( MAKEWORD( 2, 0 ), &mWsaData ); if( err != 0 ){ ERROR_EXIT(); return; } //Socket初期化 mSockI = socket( AF_INET, SOCK_STREAM, 0 ); if( mSockI == INVALID_SOCKET ){ ERROR_EXIT(); return; } mPort = 0; memset( mName, 0, sizeof( mName ) ); } //Server側 void CNetwork::Accept(){ FILE* fp; fopen_s( &fp, "messageLog.txt", "w" ); mAddr.sin_family = AF_INET; mAddr.sin_port = htons( mPort ); mAddr.sin_addr.S_un.S_addr = INADDR_ANY; if( bind( mSockI, (struct sockaddr *)&mAddr, sizeof( mAddr ) ) ) fprintf_s( fp, "bind失敗\n" ); if( listen( mSockI, 10 ) != 0 ) fprintf_s( fp, "listen失敗\n" ); int len = sizeof( mClient ); SOCKET t = accept( mSockI, (struct sockaddr*)&mClient, &len ); if( t == INVALID_SOCKET ) fprintf_s( fp, "Accept失敗\n" ); mSockYou = t; fprintf_s( fp, "Accept終了\n" ); fclose( fp ); } void CNetwork::Connect(){ FILE* fp; fopen_s( &fp, "messageLog.txt", "a" ); fprintf_s( fp, "Connect開始\n" ); //ソケットの設定 mServer.sin_family = AF_INET; mServer.sin_port = htons( mPort ); mServer.sin_addr.S_un.S_addr = inet_addr( mName ); if (mServer.sin_addr.S_un.S_addr == 0xffffffff) { fprintf_s( fp, "hostbynameへ\n" ); struct hostent *host; host = gethostbyname( mName ); if ( host == NULL ) { return false; } mServer.sin_addr.S_un.S_addr = *(unsigned int *)host->h_addr_list[0]; } fprintf_s( fp, "Socketの設定完了\n" ); while( true ){ fprintf_s( fp, "connect()開始\n" ); if( connect( mSockI, (struct sockaddr *)&mServer, sizeof( mServer ) ) == 0 ){ fprintf_s( fp, "Connect完了\n" ); break; } else{ fprintf_s( fp, "Connect失敗\n" ); Sleep(100); } } fprintf_s( fp, "Connect終了\n" ); fclose(fp); } また、ログは下のように出ました。 //サーバ側 Accept失敗 //クライアント側 Connect開始 Socketの設定完了 connect()開始 Connect失敗 ご教授お願いします。

  • 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通信プログラムで構造体データを送る事が出来ないのですが どこに誤りがあるのでしょうか? コンパイルは通ってるのですが、送信側を起動しても受信側で受け取ることが出来ていない状況です。

  • LinuxでのC言語通信プログラムについて

    サーバーとクライアントで足し算を行うプログラムを実行するとサーバーからの計算結果が返ってきません。ソースコードは以下に示します。 クライアントのプログラム #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main(void) { int sockfd ; int tolen , fromlen ; struct sockaddr_in to_address , from_address ; int result ; int ch[3] ; sockfd = socket(AF_INET,SOCK_DGRAM,0); to_address.sin_family = AF_INET ; to_address.sin_addr.s_addr = INADDR_ANY ; to_address.sin_port = htons(9734) ; tolen = sizeof(to_address); bind(sockfd , (struct sockaddr *)&to_address , tolen); printf("A = "); scanf("%d",&ch[0]); printf("B = "); scanf("%d",&ch[1]); sendto(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&to_address , tolen); recvfrom(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&from_address , &fromlen); printf("A + B = %d \n",ch[2]); close(sockfd); exit(0); } サーバーのプログラム #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main(void) { int ch[3] ; int sockfd ; int tolen , fromlen ; struct sockaddr_in to_address ; struct sockaddr_in from_address ; sockfd = socket(AF_INET,SOCK_DGRAM,0); to_address.sin_family = AF_INET ; to_address.sin_addr.s_addr = INADDR_ANY ; to_address.sin_port = htons(9734) ; tolen = sizeof(to_address); bind(sockfd , (struct sockaddr *)&to_address , tolen); while(1) { printf("server waiting\n"); recvfrom(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&from_address , &fromlen); ch[2] = ch[0] + ch[1] ; sendto(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&from_address , fromlen); } }

  • ソケットのclose

    サーバ側のソケットのcloseに関しての質問です。 LISTEN のFDをCLOSEすればACCEPTで発生したFDもなくなるものでしょうか。それとも残ってしまうものでしょうか?

  • VC++のHTTP通信

    VC++2010でHTTP通信のサンプルプログラムを走らせてみたのですが、どうも上手く行きません。 ソースは以下の通りです。 #include <stdio.h> #include <winsock2.h> int main() { WSADATA wsaData; LPHOSTENT lpHost; SOCKET s; int nRtn; SOCKADDR_IN sockadd; char szServer[256], szURL[256], szStrRcv[1024], szPort[8]; char szStr[256], szYN[4]; u_short port; unsigned int addr; while (1) { // WinSockを初期化 if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { perror("WSAStartupエラーです\n"); return -1; } // サーバ名、ポート番号、ファイル名を取得 printf("Webサーバ名----"); gets_s(szServer); printf("ポート番号----"); gets_s(szPort); if (strcmp(szPort, "") == 0) strcpy_s(szPort, "80"); port = (u_short)atoi(szPort); printf("ファイル名----"); gets_s(szURL); if (strcmp(szURL, "") == 0) strcpy_s(szURL, "/"); // ソケットをオープン s = socket(PF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) { perror("ソケットをオープンできません\n"); WSACleanup(); return -2; } // ホスト名からホスト情報を取得 lpHost = gethostbyname(szServer); if (lpHost == NULL) { // アドレスを表す文字列を数値表現に変換 addr = inet_addr(szServer); // ネットワークアドレスからホスト情報を取得 lpHost = gethostbyaddr((char *)&addr, 4, AF_INET); if (lpHost == NULL) { wsprintf(szStr, "%sが見つかりません\n", szServer); perror(szStr); WSACleanup(); return -3; } } // SOCKADDR_IN構造体に必要事項をセット memset(&sockadd, 0, sizeof(sockadd)); sockadd.sin_family = AF_INET; sockadd.sin_port = htons(port); sockadd.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list); // ソケットに接続 if (connect(s, (PSOCKADDR)&sockadd, sizeof(sockadd)) != 0) { perror("サーバソケットに接続失敗\n"); closesocket(s); WSACleanup(); return -4; } // GETリクエストを送信 wsprintf(szStr, "GET %s HTTP/1.0\r\n\r\n", szURL); nRtn = send(s, szStr, (int)strlen(szStr), 0); while(1) { // 受信用バッファ(szStrRcv)をゼロクリア memset(szStrRcv, '\0', sizeof(szStrRcv)); // データを受信 nRtn = recv(s, szStrRcv, (int)sizeof(szStrRcv) - 1, 0); // 受信したデータを標準出力に書き出す printf("%s", szStrRcv); if (nRtn == 0) break; if (nRtn == SOCKET_ERROR) { perror("recvエラーです\n"); break; } } if (shutdown(s, SD_BOTH) != 0) { // シャットダウン perror("シャットダウンに失敗しました\n"); } closesocket(s); // ソケットをクローズ WSACleanup(); // WinSockのリソースを解放 printf("\nもう一度実行しますか(Y/N)----"); gets_s(szYN); if (strcmp(szYN, "n") == 0 || strcmp(szYN, "N") == 0) break; } return 0; } 例えば、ttp://kumei.jp/c_lang/を開こうしとて、 kumei.jp 80 /c_lang/index.html と入力した場合は上手くレスポンスが帰ってきますが、 googleに接続しようと思い、 www.google.co.jp 80 / と入力すると 302 Moved と帰ってきます。 しかし www.google.co.jp 80 www.google.co.jp と入力した場合は問題なくgoogleのトップページが帰ってきます。 また、ttp://hako.gob.jp/にアクセスしようとして、 hako.gob.jp 80 /index.html と入力した場合 DOMAIN ERROR が帰ってきます。 さらに、 hako.gob.jp 80 hako.gob.jp と入力すると 400 エラーが帰って来ました。 私はwindowsプログラムに関しては全くの素人で分からない事だらけの状態です。できるだけ分り易く書いて頂けると嬉しいです。私が教えて頂きたいことは以下のことです。 ・サイト(通信相手?)による違いはどこで生まれるのでしょうか? ・また、正しくはどのように入力すれば良いのでしょうか?それはどうすれば分かるのでしょうか? ・アドレスを指定しただけであとはプログラムに自動で判断してもらうにはどうすれば良いでしょうか? ・そもそも、このプログラムでは根本的に不可能な事をやろうとしているのでしょうか?もしそうであった場合どうすれば良いでしょうか? 質問だらけで申し訳ありません。誰か分かる方がいらっしゃれば教えて下さい。

  • UDP通信について

    前回のことでかなり言われたので改変版を見てもらいたいと思います。 TCPと伝えていましたが今回、UDPに変えました。 ヘッダーはこのようになっております。 ==wsock.h== #include <Windows.h> #include <stdio.h> #pragma comment(lib,"WSock32.lib") #define PORT_NO 8000 ポート番号 #define SERVER_NAME "" enum MINE{ NONE, SERVER, CLIENT }; ソケット通信 class WSOCK{ private: WSADATA wsaData; SOCKET s; SOCKADDR_IN saddr; int rtn; int state; MINE mineFlg; char szStr[256]; エラーメッセージ用 u_short port; 変換後のポート番号 int fromlen; 受信したサイズ HOSTENT *lpHost; ホスト情報 ファイルディスクプリタをまとめた構造体 //→ソケット判別する為の管理情報 fd_set fds,readfds; public: char szRcvBuf[1024]; 受信バッファ char szSndBuf[1024]; 送信バッファ SOCKADDR_IN from; ソケットアドレス構造体 WSOCK(); ~WSOCK(); bool ServerRcv(); 受信 bool ServerSnd();送信 bool CliantRcv();受信 bool CliantSnd();送信 void SarverSet(); void ClientSet(); bool EnumMyIPAddress(); }; ==wsock.cpp== #include "wsock.h" コンストラクタ WSOCK::WSOCK(){ //WinSock初期化 rtn = WSAStartup(MAKEWORD(2,2),&wsaData); if(rtn != 0){ MessageBox(NULL,"WSAStartup失敗", "ERROR",MB_OK); state = -1; } ソケットを開く s = socket(AF_INET,SOCK_DGRAM,0); if(s<0){ MessageBox(NULL,"ソケットをオープンできません", "eRROR",MB_OK); WSACleanup(); state = 2; } 0で初期化 memset(&saddr,0,sizeof(SOCKADDR_IN)); saddr.sin_family = AF_INET;//アドレスファミリー saddr.sin_port = htons(PORT_NO);//ポート mineFlg = SERVER; サーバ側設定 if(mineFlg == SERVER) { SarverSet(); } if(mineFlg == CLIENT) {クライアント ClientSet(); } } WSOCK::~WSOCK(){ closesocket(s); ソケットのリソース解放 rtn = WSACleanup(); if(rtn == SOCKET_ERROR){ MessageBox(NULL,"WSACleanup失敗","ERrOR",MB_OK); state = -2; } } //受信 bool WSOCK::ServerRcv(){ 読み込み用fd_setの初期化 selectが毎回内容を上書きしてしまうので毎回初期化 memcpy(&fds,&readfds,sizeof(fd_set)); struct timeval timeout = {0,0};   //{1秒以上の部分()s、1秒以下の部分(ms)} fdsに設定されたソケットが読み込み可能になるまで待つ select(0,&fds,NULL,NULL,&timeout); ソケット読み込み可能データがある場合 if(FD_ISSET(s,&fds)){ fromlen = (int)sizeof(from); //nullで初期化 memset(szRcvBuf,'\0',sizeof(szRcvBuf)); //受信処理 rtn = recvfrom(s,szRcvBuf,(int)sizeof(szRcvBuf)-1,0, (SOCKADDR*)&from,&fromlen); if(rtn == SOCKET_ERROR){ MessageBox(NULL,"recvfromエラー","ERRoR",MB_OK); return false; } } szRcvBuf[rtn] | '\0';//NULLコード if(strcmp(szRcvBuf,"c_end") == 0){ MessageBox(NULL,"クライアントが接続を切りました","ERROr",MB_OK); return false; } return true; } 送信 bool WSOCK::ServerSnd(){ char buf[1024]; memset(buf,0,sizeof(buf)); //_snprintf:書式指定文字付きデータ書き込み _snprintf(buf,sizeof(buf),"data to port 8000"); //送信処理 rtn = sendto(s,szSndBuf,(int)strlen(szSndBuf)+1, 0,(LPSOCKADDR)&from, 送り先サーバ/クライアント sizeof(from)); サイズ if(rtn != (int)strlen(szSndBuf)+1){ MessageBox(NULL,"sendtoエラー","サーバーエラ",MB_OK); closesocket(s); WSACleanup(); return false; } return true; } 受信 bool WSOCK::CliantRcv(){ fromlen = (int)sizeof(from); //nullで初期化 memset(szRcvBuf,'\0',sizeof(szRcvBuf)); //受信処理 rtn = recvfrom(s,szRcvBuf,(int)sizeof(szRcvBuf)-1,0, (SOCKADDR*)&from,&fromlen); if(rtn == SOCKET_ERROR){ MessageBox(NULL,"recvfromエラー","ERRoR",MB_OK); return false; } szRcvBuf[rtn] | '\0'; //NULLコード if(strcmp(szRcvBuf,"s_end") == 0){ MessageBox(NULL,"接続を切りました","ERROr",MB_OK); return false; } return true; } 送信 bool WSOCK::CliantSnd(){ 送信処理 rtn = sendto(s,szSndBuf,(int)strlen(szSndBuf)+1, 0,(LPSOCKADDR)&saddr, 送り先サーバ/クライアント sizeof(saddr)); サイズ if(rtn != (int)strlen(szSndBuf)+1){ MessageBox(NULL,"sendtoエラー","erROR",MB_OK); closesocket(s); WSACleanup(); return false; } return true; } void WSOCK::SarverSet(){ saddr.sin_addr.s_addr = htonl(INADDR_ANY); ソケットにローカルアドレスを関連付ける if(bind(s,(LPSOCKADDR)&saddr, (int)sizeof(saddr)) == SOCKET_ERROR){ MessageBox(NULL,"bindエラー","er",MB_OK); closesocket(s); WSACleanup(); state = -3; } FD_ZERO(&readfds); FD_SET(s,&readfds); } void WSOCK::ClientSet(){    クライアント側設定    ホスト名からホスト情報を取得 lpHost = gethostbyname(SERVER_NAME); サーバのアドレスをセット memcpy(&(saddr.sin_addr), lpHost->h_addr_list[0], //サーバのアドレス lpHost->h_length); } となっております。

  • Winsockプログラムの初歩的質問(connect()がうまくいかない)

    ソケットの練習をしています。とりあえずconnect()で通信経路を確立するところまでを書いたつもりですが、以下プログラムを実行すると「サーバーソケットに接続失敗」となります。 とりあえずprintf()でチェックしたところsocket()まではうまくいっているようです。 環境:Win2000 , VC++6.0 , LAN接続でDHCP→学内サーバー です。 よろしくお願いします。 #include<winsock2.h> #include<stdio.h> int main() { WSADATA wsaData; struct hostent *host; SOCKET sock1; SOCKADDR_IN name; WSAStartup(2 , &wsaData); host=gethostbyname("www.goo.ne.jp"); //gooのIPアドレスを取得 sock1 = socket(AF_INET,SOCK_STREAM,0); //ソケット生成 /**ここからがあやしい**/ name.sin_port=htons(80); name.sin_addr=*((in_addr *)*host->h_addr_list); if(connect(sock1,(PSOCKADDR)&name,sizeof(name))){ printf("サーバーソケットに接続失敗\n"); return 0; } WSACleanup(); return(0); }

  • ソケット通信(telnet)を行いたい

    現在、クライアントプログラムをアプレットで作ってます。 サーバ側はsocketで通信できる状態で、telnetで会話できます。 そこで質問なのですが、クライアント側でのsocket通信時の手順がわかりません。。 ソケットの入門書でわかったのはここまでです。 Socket s = new Socket("10.255.50.14", 23); でソケットを作るところはわかるのですが、そこからの手順がわかりません。。 ここから、connectとか使うのでしょうが、、 どなたかご存知の方がいらっしゃいましたらお教え願いたいと思います。

    • ベストアンサー
    • Java

専門家に質問してみよう