我正在尝试做的只是检查客户端发送的消息。
我想要的是保持创建的套接字处于打开状态,并仅检查客户端不时发送的get消息。

我仅使用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 get,并且由于我保持套接字处于打开状态,所以我想等待下一条消息(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和我的控制台应用程序。

根据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的调用始终处于待处理状态,这样才能接受新的客户端。

一个简单的模型可以实现这个目的,那就是永久地循环接受并为您接受的每个客户端启动一个线程:

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

09-25 18:35
查看更多