• ベストアンサー

wsock32.dllによるconnectのtimuout設定方法について

いつも参考にしています 現在 VB6+Win2000(sp6)+wsock32.dllにて、ソケットを使用したapを作成しています WSAStartup ↓ socket ↓ connect ↓ ioctlsocket ↓ send ↓ closesocket ↓ WSACleanup 上記、順にてコーディングしています このconnectのタイムアウトを設定したいのですが、どのようにすれば良いのでしょうか? ヒントを御願いします

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

  • ベストアンサー
回答No.1

winsockのconnectタイムアウトの検出は面倒です。 余計なことですが、Winsockコントロールは使わないのですか?

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=583588
teto_pun2
質問者

お礼

回答ありがとうございます Winsockコントロールを使用しない理由は、各PC別にセットアップが必要です。 wsock32.dllであれば、各PCにセットアップする必要がなく、ファイルサーバーにAPを複写していれば良いと思っています(PCは、Windows2000なので)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • WinSockのクライアント処理

    WinSockについてお尋ねしたいのですが、 クライアントからのサーバへ1頁分のデータを要求しそれを画面に表示する プログラムを作成していますが、 一ページ分の要求毎に、以下の一連の処理を行っています。 WSAStartup socket connect send recv closesocket WSACleanup この為か、netstrtで確認すると"TIME_WAIT"が多数発生しポートが あふれてしまう事があります。 そこで、私は、 WSAStartupとWSACleanup を、クライアント起動時に行う。 (いろいろ調べると、これは絶対修正すべきという事がわかりました。) もうひとつ、 "TIME_WAIT"への対処として、 socket connect も、クライアント起動時に行う事を考えています。 私の考えは適切なのでしょうか? "TIME_WAIT"への一般的な対処などお教えください。 宜しくお願いいたします。

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

  • ゲームの通信プログラムについてなんですが

    ボードゲームで対戦用にとTCP通信プログラムを導入したいのですがどうにもうまくいきません。 ゲームのところでつながっているにはつながっているんですが無限ループのように通信しているようなんです。 VisualStudio2010とwinsocketを使っております。 サーバーのプログラムはこうです。 void COMMU::SERWSA() { port = 6543; //WinSock初期化 rtn = WSAStartup( MAKEWORD(2,2), &wsaData); } void COMMU::SERSOCK() { listen_s = socket( AF_INET, SOCK_STREAM, 0); if(listen_s < 0)     { WSACleanup(); return; } //0で初期化 memset(&saddr, 0, sizeof(SOCKADDR_IN)); saddr.sin_family = AF_INET; saddr.sin_port = htons(port); saddr.sin_addr.s_addr = INADDR_ANY; if(bind(listen_s, (struct sockaddr *)&saddr, sizeof(saddr)) == SOCKET_ERROR)     { closesocket(listen_s); WSACleanup(); return; } } void COMMU::SERLIS() { //クライアントからの接続待ち状態にする if(listen(listen_s, 0) == SOCKET_ERROR) { closesocket(listen_s); WSACleanup(); return; } fromlen = (int)sizeof(from); s = accept(listen_s, (SOCKADDR *)&from, &fromlen); if(s == INVALID_SOCKET)     { closesocket(listen_s); WSACleanup(); return; }else{ inet_ntoa(from.sin_addr); } //リスンソケットはもう不要 closesocket(listen_s); MessageBox(NULL,"繋がった","読み込みエラー", MB_OK |MB_ICONERROR); } COMMU::~COMMU() { if(shutdown(s, SD_BOTH) != 0){ perror("シャットダウンに失敗しました\n"); } //ソケットのクローズ closesocket(s); //ソケットのリソース解放 rtn = WSACleanup(); if(rtn == SOCKET_ERROR){ fprintf(stderr, "WSACleanup失敗\n"); return; } printf("WSACleanup成功\n"); printf("サーバ終了\n"); } 続いてクライアントです。 void Client::CLWSA() { //ポート番号の入力 port = 6543; //数値に変換 //WinSock初期化 rtn = WSAStartup( MAKEWORD(2,2),//上位と下位を指定してWORDデータを返すマクロ &wsaData); } void Client::CLSOCK() { //ソケットを開く s = socket( AF_INET, //アドレスファミリ SOCK_STREAM, //TCP(接続型通信)で通信 0); //プロトコル(0:WinSockが自動的に判断) if(s < 0){ //perror("ソケットをオープンできません\n"); WSACleanup(); return; } //ホスト名からホスト情報を取得 lpHost = gethostbyname("PC○○"); if(lpHost == NULL)     { addr = inet_addr(szServer); //ネットワークアドレスからホスト情報を取得 lpHost = gethostbyaddr((char*)&addr,4,AF_INET); } if(lpHost == NULL)    { printf("ホスト情報取得エラー\n"); closesocket(s); WSACleanup(); getchar(); return; } } void Client::CLCONNE() { //0で初期化 memset(&saddr, 0, sizeof(SOCKADDR_IN)); saddr.sin_family = lpHost->h_addrtype; //ホストのアドレスファミリ saddr.sin_port = htons(port); saddr.sin_addr.s_addr = *((u_long *)lpHost->h_addr); //接続要求する if(connect(s, (SOCKADDR *)&saddr, sizeof(saddr)) == SOCKET_ERROR){ printf("connectエラー\n"); closesocket(s); WSACleanup(); getchar(); return; }else{ MessageBox(NULL,"つながりました","読み込みエラー", MB_OK |MB_ICONERROR); } } Client::~Client() { if(shutdown(s, SD_BOTH) != 0){ perror("シャットダウンに失敗しました\n"); } //ソケットのクローズ closesocket(s); //ソケットのリソース解放 rtn = WSACleanup(); if(rtn == SOCKET_ERROR){ fprintf(stderr, "WSACleanup失敗\n"); return; } printf("WSACleanup成功\n"); printf("クライアント終了\n"); } です。 わかりにくいかと思いますがかなり困ってます・・・ 回答よろしくお願いします。

  • VB+WSock32.sll+srvanyにてログオフすると通信できない?

    【状況】 VB+WSock32.dllにてwinsockにてメッセージを受信するとポップアップするap(net sendのようなもの)を作成しました。 これをSRVANY.exe(リソキ)によりサービスとして登録しました。 【環境】 Windows2000(sp4)+VB(sp6) 【症状】 ログオフすると通信ができない(netstat -aにてポートが待っていない) しかし、次の場合は、通信できます (1)再起動後、ログオンしない場合 (2)上記後、ログイン後 ヒントがあれば、よろしく御願いします

  • ActiveBasic インターネットを通じてソフト間で通信する

    AB 4.23.00を使用しています。 今回、ネットワークのプログラムの勉強を始め、とりあえず、 ネットワークを通して、ソフト間で簡単なチャットが出来るものを作ってみようと思い、作り始めました。 以前、CreateMailslot関数などで出来ると思い、探し回ったのですが、どうしても出来ないので、質問させていただいたところ、『それでは出来ない』とのこと(http://oshiete1.goo.ne.jp/qa5833366.html)だったので、 新たな方法を探していたところ、ソケットというものを使えば出来るというようなことが書かれているページを見つけ、早速参考にさせていただいています。 ですが、どうも、構造というか、その辺がよく分かっていないので、 どこにどの値をどう入れればいいのか・・・などがよく分かりません。 送信用のプログラムは、おそらく書けていると思いますが(一応貼らせていただきます)、 受信用のプログラムでちょっとつまずいています。 connect関数の接続先はどう指定すればいいのか、ということです。 ご存知の方、いらっしゃいましたら、ご教授の方、お願いします。 【送信用】 #console #include <api_winsock2.sbp> Declare Function bind Lib "wsock32.dll" (s As Long,ByRef sName As sockaddr,namelen As Long) As Long Declare Function listen Lib "wsock32.dll" (s As Long,backlog As Long) As Long Declare Function accept Lib "wsock32.dll" (s As Long,ByRef addr As sockaddr,ByRef addrlen As Long) As Long Dim wsaData As WSADATA WSAStartup(MAKELONG(2,0),wsaData) Print "WSAStartup--->"+Date$()+" "+Time$() Dim s As DWord s=socket(AF_INET,SOCK_STREAM,0) If s=0 Then Print "Error-------->Cannot Socket Create" Sleep(-1) End If Dim sar As SOCKADDR With sar .sa_family=AF_INET End With If bind(s,sar,Len(sar))<>0 Then Print "Error-------->BIND ERROR" Sleep(-1) End If Dim sarlen As Long Dim news As DWord listen(s,128) news=accept(s,sar,sarlen) Dim buf[256] As Byte recv(news,buf,256,0) send(news,"HELLO",lstrlen("HELLO"),0) closesocket(s) closesocket(news) Print "SENDED" Sleep(-1) ----------------------------------------------------------------- 【受信用(途中まで)】 #console #include <api_winsock2.sbp> Declare Function bind Lib "wsock32.dll" (s As Long,ByRef sName As sockaddr,namelen As Long) As Long Declare Function listen Lib "wsock32.dll" (s As Long,backlog As Long) As Long Declare Function accept Lib "wsock32.dll" (s As Long,ByRef addr As sockaddr,ByRef addrlen As Long) As Long Dim wsaData As WSADATA WSAStartup(MAKELONG(2,0),wsaData) Print "WSAStartup--->"+Date$()+" "+Time$() Dim s As DWord s=socket(AF_INET,SOCK_STREAM,0) If s=0 Then Print "Error-------->Cannot Socket Create" Sleep(-1) End If Dim sar As SOCKADDR With sar .sa_family=AF_INET End With If bind(s,sar,Len(sar))<>0 Then Print "Error-------->BIND ERROR" Sleep(-1) End If Dim sock_sin As SOCKADDR_IN With sock_sin .sin_family=AF_INET End With If connect(s,sock_sin,Len(sock_sin))<>0 Then Print "Error-------->connect ERROR" Sleep(-1) End If

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

  • 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); } となっております。

  • [Win + Eclipse + GCC]socketクライアントの作成方法

    Windows XP に GCC と Eclipseをインストールしました。 過去にVisual Studio 2008 Express Editionを使用していたとき ソケットクライアントは以下のとおり実装しました。 ーーーー #include <iostream> #include <ws2tcpip.h> #pragma comment(lib,"ws2_32.lib") using namespace std; int main() { int dstSocket; struct sockaddr_in dstAddr; WSADATA data; WSAStartup(MAKEWORD(2,0), &data); // sockaddr_in 構造体のセット memset(&dstAddr, 0, sizeof(dstAddr)); dstAddr.sin_port = htons(80); dstAddr.sin_family = AF_INET; dstAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // ソケットの生成 dstSocket = socket(AF_INET, SOCK_STREAM, 0); //接続 if(connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr))){ cout << "接続できませんでした\n" << endl; return(-1); } char buffer[1024] = "GET / HTTP/1.0\r\n\r\n"; send(dstSocket, buffer, sizeof(buffer), 0); //パケットの受信 int n = recv(dstSocket, buffer, sizeof(buffer), 0); cout << buffer << endl; // Windows でのソケットの終了 closesocket(dstSocket); WSACleanup(); return(0); } ーーーー 上記と同じ機能をGCC上で実装したいのですが、どこかに コードのサンプルがのっているWebサイトはありますか?

  • Vista 非同期接続

    Vista と VC++2005 でソケット関連のソフトを作っています。  下のようなコードでは BEGIN_MESSAGE_MAP(SQMailDLDlg, CDialog) // Don't show process //{{AFX_MSG_MAP(MailRecDlg2) ON_MESSAGE(SM_ASYNC, HandleAsyncMsg) //}}AFX_MSG_MAP END_MESSAGE_MAP() として、登録してある関数 HandleAsyncMsg() が呼び出されないのですが、 どこに原因があるのでしょうか? SendMessage(SM_ASYNC); とすれば、もちろん呼び出せます。 RetVal = getaddrinfo(gszServerName, Port, &Hints, &AddrInfo); if (RetVal != 0) { sprintf(outbuf3, "Cannot resolve address [%s] and port [%s], error %d: %s\n", Server, Port, RetVal, gai_strerror(RetVal)); WSACleanup(); return;// -1; } for (AI = AddrInfo; AI != NULL; AI = AI->ai_next) { ConnSocket = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol); if (ConnSocket == INVALID_SOCKET) { sprintf(outbuf3,"Error Opening socket, error %d: %s\n", WSAGetLastError(), DecodeError(WSAGetLastError())); continue; } if (WSAAsyncSelect(ConnSocket, *this, SM_ASYNC, FD_READ|FD_WRITE|FD_CLOSE|FD_CONNECT) == SOCKET_ERROR){ MessageBox("WSAAsyncSelect() failed","Error", MB_OK); closesocket(ConnSocket); ConnSocket = INVALID_SOCKET; continue; } if (connect(ConnSocket, AI->ai_addr, AI->ai_addrlen) == SOCKET_ERROR){ if(WSAGetLastError() != WSAEWOULDBLOCK){ closesocket(ConnSocket); ConnSocket = INVALID_SOCKET; continue; } break; } } if (AI == NULL) { sprintf(outbuf3, "Fatal error: unable to connect to the server.\n"); WSACleanup(); return;// -1; } よろしくお願いします。

  • Cプログラム UDP送信の送信データに関して

    以下の2つのプログラムでの質問なのですが、 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "\x42\42\0\0\0\0\2\0\1\2\x44\x33\5", 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } と #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } について、送信データ部分に「¥」入ることによって、送信プロセスでどのような処理がなされているのですか? ¥~¥までで1バイトということで処理してくださいね、と処理系?に指示しているのですか? また、「¥」はC言語ならではの表記の仕方なのですか?少し、伝えるのが難しいですが、何でもいいのでご回答頂けませんか?宜しくお願いします。