C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ソケットのバインドについて


(過去ログ 64 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■37028 / inTopicNo.1)  ソケットのバインドについて
  
□投稿者/ とまと (1回)-(2009/06/11(Thu) 16:59:55)

分類:[C/C++] 

お世話になります。とまとです。

開発環境:Win2000、VC++6.0

ある特定ポート(例:5555)が使用されているかを、以下のソースを使ってチェックしようとしています。
ポートが使われていれば
if (bind(ListenSocket, (SOCKADDR*)&service, sizeof(service))
            == SOCKET_ERROR)
の箇所でエラーに入ります。

Win2000・XPではポートが使われていればエラーになるのですが、Vista・Win7ではエラーになりません。
(ポートは使用されています:netstatでも確認してあります)

Vista・win7では何かが必要なのでしょうか?
ご教授お願いします。


---ソース---

#include <stdio.h>
#include "winsock2.h"

int main()
{
    /*
     * 変数の宣言。
     */
    WSADATA wsaData;
    int iResult = 0;
    SOCKET ListenSocket;
    struct sockaddr_in service;

    /*
     * Winsockの初期化。
     */
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR)
    {
        printf("Error at WSAStartup()\n");
        return 0;
    }

    /*
     * 接続要求受入用のリスニング用のソケットを作成。
     */
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET)
    {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
        return 0;
    }

    /*
     * そのsockaddr_in構造体はそのアドレスファミリィを指定する、
     * IPアドレス、そして、結びつけられているソケットのためのポート。
     */
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr("127.0.0.1");
    service.sin_port = htons(5555);

    /*
     * ソケットをバインドする。
     */
    if (bind(ListenSocket, (SOCKADDR*)&service, sizeof(service))
            == SOCKET_ERROR)
    {
        printf("bind() failed.\n");
        closesocket(ListenSocket);
        return 0;
    }

    WSACleanup();
    return 0;
}



引用返信 編集キー/
■37035 / inTopicNo.2)  Re[1]: ソケットのバインドについて
□投稿者/ オショウ (224回)-(2009/06/11(Thu) 17:49:12)
> Win2000・XPではポートが使われていればエラーになるのですが、Vista・Win7ではエラーになりません。
> (ポートは使用されています:netstatでも確認してあります)
>
> Vista・win7では何かが必要なのでしょうか?
> ご教授お願いします。

  私の環境は、VISTA Ultimate ですが、使用中のポート番号に設定
  したら正しくbind() failed.となりました。

以上。
引用返信 編集キー/
■37037 / inTopicNo.3)  Re[2]: ソケットのバインドについて
□投稿者/ .SHO (876回)-(2009/06/11(Thu) 18:07:56)
>   私の環境は、VISTA Ultimate ですが、使用中のポート番号に設定
>   したら正しくbind() failed.となりました。

やってみたんですが、Vista Business ですが、自分もエラーになりません。
う〜ん、、なんだろう?!?!

引用返信 編集キー/
■37038 / inTopicNo.4)  Re[3]: ソケットのバインドについて
□投稿者/ オショウ (225回)-(2009/06/11(Thu) 18:13:19)
> やってみたんですが、Vista Business ですが、自分もエラーになりません。
> う〜ん、、なんだろう?!?!

  摩訶不思議・・・

で、・・・

struct servent *p_ent;
   p_ent = getservbyport(htons(5555),"tcp");

ってやってみて、p_ent が、NULLなら未使用と言う判断はダメ?

以上。参考まで
引用返信 編集キー/
■37040 / inTopicNo.5)  Re[3]: ソケットのバインドについて
□投稿者/ オショウ (226回)-(2009/06/11(Thu) 18:31:48)
> やってみたんですが、Vista Business ですが、自分もエラーになりません。
> う〜ん、、なんだろう?!?!

  こんな情報見つけました・・・

  ちょっと目からウロコ?!
  http://msdn.microsoft.com/ja-jp/library/aa395195.aspx

以上。参考まで・・・
引用返信 編集キー/
■37042 / inTopicNo.6)  Re[4]: ソケットのバインドについて
□投稿者/ .SHO (877回)-(2009/06/11(Thu) 18:42:39)
>   こんな情報見つけました・・・
>
>   ちょっと目からウロコ?!
>   http://msdn.microsoft.com/ja-jp/library/aa395195.aspx

なんと!こんなことが出来るのか!

でも、net.tcp共有サービスはディフォルトのまま「無効」になってました。。
引用返信 編集キー/
■37060 / inTopicNo.7)  Re[5]: ソケットのバインドについて
□投稿者/ とまと (2回)-(2009/06/12(Fri) 11:51:21)
2009/06/12(Fri) 11:53:47 編集(投稿者)

返信ありがとうございます。

オショウさんの

struct servent *p_ent;
   p_ent = getservbyport(htons(5555),"tcp");

を試してみましたが、win2000、Win7共にポートが使用されていようといまいと常にp_entの中身はNULLになります。。。
自作アプリが使用しているポート番号なので、getservbyport()では判定できないのでしょうか?


net.tcp共有サービスは、こちらも「無効」となっていました。試しに「有効」に変えても動作は変わりませんでした。


引用返信 編集キー/
■37061 / inTopicNo.8)  Re[4]: ソケットのバインドについて
□投稿者/ aetos (159回)-(2009/06/12(Fri) 11:55:39)
aetos さんの Web サイト
No37040 (オショウ さん) に返信
>>やってみたんですが、Vista Business ですが、自分もエラーになりません。
>>う〜ん、、なんだろう?!?!
>
>   こんな情報見つけました・・・
>
>   ちょっと目からウロコ?!
>   http://msdn.microsoft.com/ja-jp/library/aa395195.aspx
>
> 以上。参考まで・・・

これは…WCF のサービスか何かがアプリに代わって唯一のポート利用者となるのであって、ソケットレベルで共有できるわけではないと思うなぁ。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -