c# - 套接字保持套接字打开,只检查客户端发送的消息

标签 c# .net sockets

我想做的只是检查客户端发送的消息。 我想要的是将创建的套接字保持打开状态,并只检查客户端不时发送的获取消息。

我只使用 System.Net.Sockets,我想实现基于 barkeley 套接字的实现。

这是我的代码,

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Runtime.Remoting.Metadata.W3cXsd2001;
namespace Socket_v1._0
{
    class Program
    {
        private const int BUFSIZE = 200;// Size of receive buffer
        private const int BACKLOG = 5; // O valor backlog define o número de pedidos de conexão que podem ser mantidos em espera sem serem aceites pela "system-call" accept.
        static void Main(string[] args)
        {
            int servPort = 8070; //port number

            Socket server = null;
            try
            {
                // Create a socket to accept client connections
                server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                server.Bind(new IPEndPoint(IPAddress.Any, servPort));
                server.Listen(BACKLOG);
            }
            catch (SocketException se)
            {
                Console.WriteLine(se.ErrorCode + ": " + se.Message);
                Environment.Exit(se.ErrorCode);
            }
//for now the server socket is waiting for connections
            byte[] rcvBuffer = new byte[BUFSIZE]; // definir buffer
            int bytesRcvd = 0 ; // numero de bytes recebidos
            for (; ; )
            { // Run forever, accepting and servicing connections
                Socket client = null;
                try
                {

                    client = server.Accept(); // Get client connection
                    Console.Write("Handling client at " + client.RemoteEndPoint + " - ");

                    do {
                        bytesRcvd = client.Receive(rcvBuffer, 0, rcvBuffer.Length, SocketFlags.None);
                        string s = Encoding.ASCII.GetString(rcvBuffer, 0, bytesRcvd);
                        }while (true);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    client.Close();
                }
            }
        }
      }
    }

所以客户端不时发送一个http get,我想看到那些消息,

现在这是第一次运行字符串获取 http 获取,并且因为我保持套接字打开,所以我想等待下一条消息 (do{}(while(true)))。 它返回到 client.receive,然后停止。 在检测到来自客户端的另一条消息后,它进入永远循环并且字符串为空。

我想要类似于聊天的东西,客户端发送消息,服务器显示消息。

那么打开套接字后,我应该怎么做才能从客户端获取消息,然后显示它,然后等待另一条消息?

另一件困扰我的事情是客户端 http get:

这是http获取

GET /iclock/cdata?SN=2182682370001&options=all&pushver=2.1.2&language=80 HTTP/1.1
Host: 192.168.1.43:8070
User-Agent: iClock Proxy/1.09
Connection: close
Accept: * / *

连接关闭是什么意思?每次客户端要发送请求时我都需要创建一个新套接字吗?

尝试弄清楚,我在代码中做了一些更改,在我得到这个的同时执行

 while ((bytesRcvd = client.Receive(rcvBuffer/*, 0, rcvBuffer.Length, SocketFlags.None*/)) > 0) 
                    { 
                        totalBytesEchoed += bytesRcvd;
                        string s = Encoding.ASCII.GetString(rcvBuffer, 0, bytesRcvd);
                        Console.WriteLine(s);
                    } 

图片: Wireshark and console app

所以在图像中我已经运行了 wireshark 和我的控制台应用程序。

根据 wireshark,客户端试图发送 2 个 http 请求,但根据控制台,它只显示了一个...

我想显示这两个电话..

几年前,我用c语言做了一些关于套接字的练习。

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void main(void)
{
  struct sockaddr_in me, from;
  int newSock, sock = socket(AF_INET, SOCK_STREAM, 0);
  int adl = sizeof(me);
  char linha[81];
  bzero((char *) &me, adl);
  me.sin_family = AF_INET;
  me.sin_addr.s_addr = htonl(INADDR_ANY ); /* endereco IP local */
  me.sin_port = htons(8450); /* porta local  */
  if (-1 == bind(sock, (struct sockaddr *) &me, adl))
  {
    close(sock);
    puts("Porta ocupada");
    exit(1);
  }
  listen(sock, 5);
  newSock = accept(sock, (struct sockaddr *) &from, &adl);
  close(sock);
  do
  {
    read(newSock, linha, 81);
    puts(linha);
  } while (strcmp(linha, "exit"));
  close(newSock);
}

这是在 c 中,所以如您所见,接受后套接字保持打开状态,并且客户端发送消息,它仅在用户向服务器发送退出时关闭套接字... 可能会有客户端不发送的时候...但是套接字仍然打开,并且当它检测到

这是我想要实现的示例,使用 system.net.sockets 库,,,

谢谢

最佳答案

有两种套接字:用于监听的套接字(它永远不会连接)和对应于连接的套接字(每个套接字代表一个连接)。

Accept 向您返回一个已连接到客户端的套接字,该套接字刚刚被接受。每次调用 Accept 都会接受一个新的独立客户端。

如果您想一次处理多个客户端(这几乎总是需要的),您必须确保对 Accept 的调用始终处于挂起状态,以便可以接受新客户端。

实现此目的的一个简单模型是永远在循环中接受并为您接受的每个客户端启动一个线程:

while (true) {
 var clientSocket = listeningSocket.Accept();
 Task.Factory.StartNew(() => HandleClient(clientSocket));
}

关于c# - 套接字保持套接字打开,只检查客户端发送的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24451459/

相关文章:

c# - 在控制台应用程序中包装 C# 服务以对其进行调试

.net - 如何本地化应用程序中所有线程的字符串资源查找?

c - 尝试从服务器向客户端发送消息的段错误

python - Python套接字错误-如何修复

c# - Docker Copy 使用 ASP.net Core 失败

c# - 如何将数据库中的单行显示为多行到gridview?

c# - 具有相同方法的多个类 - 最佳模式

.net - 从 Selenium WebDriver 运行 chrome 扩展

c# - 动态加载dll

sockets - Nginx connect() 到 unix :/var/run/fcgiwrap. 套接字失败