我正在尝试使用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();
答案 0 :(得分:0)
而且......你的问题究竟是什么?
我对c#并不是太强大,但是在c ++上,你要么实例化一个线程,它会一直监听select的传入数据(也使它成为'Async'),然后用同步方法处理它(使用一个必要时可以使用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.