-1

クライアントとサーバーの2つのプログラムがあり、クライアントプログラムはTCPプロトコルで特定のポート(例:1370)でデータを送信します。
次のコードを使用して、サーバー プログラムでクライアントを待機します。

IPAddress IP = (my IP Address);
IPEndPoint ipep = new IPEndPoint(IP, 1370);

listenSocket = new Socket(AddressFamily.InterNetwork, 
                          SocketType.Stream, 
                          ProtocolType.Tcp);
listenSocket.Bind((EndPoint) ipep);
listenSocket.BeginReceive(clientData, 0, clientData.Length,
                          SocketFlags.None, new AsyncCallback(OnReceiveClient), null);

最後の行にエラーがあります。ソケットは TCP プロトコルでデータを受信できません。このコードは、UDP プロトコルで非常にうまく動作します。手伝って頂けますか?!(ありがとう)

4

3 に答える 3

2

簡単に言うと、TCP/IP プロトコルには接続確立フェーズがあります。したがって、サーバーは を呼び出す必要がありbind()、クライアントは を呼び出す必要があります。接続が確立されると、サーバーは新しいクライアント サーバーソケットを返します。このソケットにより、サーバーはクライアントと通信できます (つまり、接続を提供します)。listen()accept()connect()accept()

次の例をお勧めします。

  1. 同期サーバー ソケットの例
  2. 同期クライアント ソケットの例
于 2012-08-03T09:51:33.843 に答える
1

コードは次のようになります

IPAddress IP = (my IP Address);
listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

IPEndPoint ipep = new IPEndPoint(IP, 1370);
listenSocket.Bind((EndPoint) ipep);

listenSocket.Listen(4);
// Create the call back for any client connections...
listenSocket.BeginAccept(new AsyncCallback (OnClientConnect), null);

そしてクライアントが接続されると

// This is the call back function, which will be invoked when a client is connected
 public void OnClientConnect(IAsyncResult asyn)
 {
   try
   {
        Socket workerSocket = m_mainSocket.EndAccept (asyn);        
        workerSocket.BeginReceive();                    
        // Since the main Socket is now free, it can go back and wait for
        // other clients who are attempting to connect
        m_mainSocket.BeginAccept(new AsyncCallback ( OnClientConnect ),null);
   }
   catch(ObjectDisposedException)
    {
    }
    catch(SocketException se)
    {
    }

  }
于 2012-08-03T09:31:45.593 に答える
0

このコードを試してください

           public void Listen()
            {
            string portStr = "5656";
            int port = System.Convert.ToInt32(portStr);
            // Create the listening socket...
            m_mainSocket = new Socket(AddressFamily.InterNetwork,                            SocketType.Stream,ProtocolType.Tcp);
            IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, port);
            // Bind to local IP Address...
            m_mainSocket.Bind(ipLocal);
            // Start listening...
             m_mainSocket.Listen(4);
             btn_start.Enabled = false;
             lbl_connect.Visible = true;
            // Create the call back for any client connections...
            m_mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
           }



             public void OnClientConnect(IAsyncResult asyn)
             {
             m_workerSocket[m_clientCount] = m_mainSocket.EndAccept(asyn);
            // Let the worker Socket do the further processing for the 
            // just connected client
            WaitForData(m_workerSocket[m_clientCount]);
            // Now increment the client count
            ++m_clientCount;
            // Display this client connection as a status message on the GUI    


            // Since the main Socket is now free, it can go back and wait for
            // other clients who are attempting to connect
            m_mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);

//** クライアント データを待機中

            public void WaitForData(System.Net.Sockets.Socket soc)
            {
                try
                {
                   if (pfnWorkerCallBack == null)
                   {
                       // Specify the call back function which is to be 
                      // invoked when there is any write activity by the 
                      // connected client
                      pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
                   }
                    SocketPacket theSocPkt = new SocketPacket();
                    theSocPkt.m_currentSocket = soc;
                   // Start receiving any data written by the connected client
                   // asynchronously
                    soc.BeginReceive(theSocPkt.dataBuffer, 0,                                                      theSocPkt.dataBuffer.Length,
                               SocketFlags.None,
                               pfnWorkerCallBack,
                               theSocPkt);
                    }
                    catch (SocketException se)
                    {
                        MessageBox.Show(se.Message);
                    }

               } 
于 2012-08-03T10:55:58.483 に答える