我正在尝试做的只是检查客户端发送的消息。
我想要的是保持创建的套接字处于打开状态,并仅检查客户端不时发送的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));
}