2011-02-04 14 views
-1

34(結果が大きすぎます)のbind()というエラーが表示されています。結果が大きすぎるC++ソケット

void Connect(string address, unsigned short port){   
      memset(&server2, 0, sizeof(server2)); 
      server2.sin_family = AF_INET; 
      server2.sin_addr.s_addr = inet_addr(address.c_str()); 
      server2.sin_port = htons(port); 

      desc2 = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    
      if(desc2 == -1) {    
       cout << "Error in Socket()" << endl;  
      } 

      if((::bind(desc2,(sockaddr*)&server2, sizeof(server2))) == -1) {       
       cout << "Error in Bind() " << errno << endl; 
      } 

      if((::connect(desc2, (sockaddr*)&server2, sizeof(server2))) > 0) {      
       cout << "Error in Connect()" << endl;  
      } 
      cout << "YOU ARE CONNECTED TO " << address << " ON PORT " << port << endl;    
} 

PS:私も1年前にこのエラーを得た、問題は私が接続するソケットアドレスを、初期化時に悪い何かを書く持っていた単純なものでしたが、今再び、私はミスを犯した見当もつかない。

+0

ドット表記で、それがドメインのようなものなら、それはうまくいきます.... strange – Kobe

+0

エラーを指摘してください:接続は成功すると0を返し、 '== 0'を使います。私は-1を 'SOCKET_ERROR'に変更するでしょう。 – Marlon

+0

私は両方ともSOCKET_ERRORに設定しました。 Btw私は本当に接続時にバインドを呼び出す必要がありますか、または私は接続(サーバーの部分)を聞いているときだけですか? – Kobe

答えて

0

私はあなたの問題がそのタイプの結果を正確に返す原因を知りません。

あなたはプロキシサーバーだと言いましたので、着信接続を待機しています。これを試してみてください :あなたはおそらく非同期プログラミングする方法を学習したいと思うでしょう

server2.sin_addr.s_addr = 0; 
server2.sin_family = AF_INET; 
server2.sin_port = htons(port); 

desc2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

// Puts the socket in listening mode, allowing 10 connection requests to queue. 
bind(desc2, (sockaddr*)&server2, sizeof(server2)); 
listen(desc2, 10); 

// Accepts the first connection request. 
SOCKET accepted_socket = accept(desc2, NULL, NULL); 
std::cout << "connection accepted!\n"; 

+0

これはサーバーの部分ですが、これは私のために働いていますが、その後、私はサーバーに接続して、私に接続しているクリントが言うようにしたいと言います。 com "ポート80 ....と私はGoogleに接続する必要があります – Kobe

+0

それは2つの別のソケットが必要です。それらのソケットの1つは、あなたとクライアントの間の接続、もう1つはあなたとGoogleの間の接続です。あなたのクライアントが "ポート80でgoogleに接続"するよう指示したら、別のソケットを作成してGoogleに接続する必要があります...ポート80で – Marlon

+0

私が投稿したコードは私とgoogleのソケットbeetweenです(desc2、 struct sockaddr server2)。ソケットはcleintと私との間にあります(descr desc、sockaddr server)。Btw後に私はそれがスレッド(私は非同期プログラミングを意味すると思う)との部分が付属して動作するようになる – Kobe

0

私は分かりませんなぜ「名前が長すぎます」 - server2が宣言され定義されていないと、確かに分かりません。

しかし、私は同じアドレスで同じソケットにbind()、その後connect()を呼び出すと失敗することを知っていますか- bind()ソケットにローカルアドレスを割り当てられ、connect()リモートアドレスに接続します。ソケットの両端に同じアドレスを与えることは、ひどく終わることがあります。

bind()より前のプロトコルはほとんどありません。connect()より前です。 (例外として、1024より小さいポートはルートでしか開くことができないので、この接続を信頼することができます。年齢で使用されていない認証の形式です)。

bind()listen()コール直前。クライアントは「よく知られたポート」上のサーバーに接続しようとします。bind()はその名前を割り当てるためのメカニズムです。

+0

ああ、説明してくれてありがとう – Kobe

関連する問題