-1

我正在尝试使用 sendfile C# 异步套接字(作为服务器)的功能并在 C++ 本机代码客户端接收此文件。当我使用它从我的 C# 服务器更新客户端的文件时,由于要求,不能使用 webServices。这是我用来发送文件的

IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress  ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);

// Create a TCP socket.
Socket client = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp);

// Connect the socket to the remote endpoint.
client.Connect(ipEndPoint);

// There is a text file test.txt located in the root directory.
string fileName = "C:\\test.txt";

// Send file fileName to remote device
Console.WriteLine("Sending {0} to the host.", fileName);
client.SendFile(fileName);

// Release the socket.
client.Shutdown(SocketShutdown.Both);
client.Close();
4

1 回答 1

0

还有……你的问题到底是什么?

我对 c# 不太擅长,但是在 c++ 上,您可以实例化一个线程,该线程永远使用 select 侦听传入数据(也使其成为“异步”),然后以同步方法处理它(必要时使用 CriticalSection )。

只是为了澄清这一点,这是服务器/客户端通信的一般工作方法。

服务器:实例化 Socket,将自身绑定到端口并监听传入的连接。当连接进来时,执行握手并将新客户端添加到客户端集合中。响应传入请求/向所有客户端发送定期更新

客户端:实例化套接字,使用'connect'连接到服务器并开始根据协议进行通信。

编辑:只是为了确保,这不是一个沟通不畅的小问题,你的意思是如何在客户端保存文件?

您可能想要使用此代码:(假设您在线程中使用 select)

fd_set fds;             //Watchlist for Sockets
int RecvBytes;
char buf[1024];
FILE *fp = fopen("FileGoesHere", "wb");
while(true) {
    FD_ZERO(&fds);      //Reinitializes the Watchlist
    FD_SET(sock, &fds); //Adds the connected socket to the watchlist
    select(sock + 1, &fds, NULL, NULL, NULL);    //Blocks, until traffic is detected
    //Only one socket is in the list, so checking with 'FD_ISSET' is unnecessary
    RecvBytes = recv(sock, buf, 1024, 0);  //Receives up to 1024 Bytes into 'buf'
    if(RecvBytes == 0) break;   //Connection severed, ending the loop.
    fwrite(buf, RecvBytes, fp); //Writes the received bytes into a file
}
fclose(fp);                     //Closes the file, transmission complete.
于 2012-07-19T08:23:52.587 回答