C# 从多个客户端到一台服务器的文件传输
我不熟悉使用C#的windows socket编程,我想创建一个在多个客户端和一台服务器下运行的应用程序。服务器将等待来自客户端的传入连接,并为每个连接分配一个新端口。 服务器应接受来自多个客户端的文件传输。传输文件的大小约为10-20 MB 我读了很多教程和示例,但它们是以一对一的模式转换的。我能够将多个客户端连接到一台服务器,并通过它发送文本。服务器正在接受客户端连接及其发送的文本消息,但我不知道以相同的模式传输文件 如果有任何教程、示例或指南可以帮助我理解从多个客户机到单个服务器的文件传输,我会帮上大忙。其实这很容易 将输入连接保存在阵列中。 启动一个从套接字获取数据的新线程,并将其放入输出缓冲区(确保其线程安全),就这样 编辑日期18-6-2014 这里是我的网络类的C++例子,虽然不完美,但是你会明白的。 m#u clientList是一个向量,我保存了连接,但我不知道c#是否有向量,但类似于list的东西会起作用C# 从多个客户端到一台服务器的文件传输,c#,client-server,tcpclient,file-transfer,C#,Client Server,Tcpclient,File Transfer,我不熟悉使用C#的windows socket编程,我想创建一个在多个客户端和一台服务器下运行的应用程序。服务器将等待来自客户端的传入连接,并为每个连接分配一个新端口。 服务器应接受来自多个客户端的文件传输。传输文件的大小约为10-20 MB 我读了很多教程和示例,但它们是以一对一的模式转换的。我能够将多个客户端连接到一台服务器,并通过它发送文本。服务器正在接受客户端连接及其发送的文本消息,但我不知道以相同的模式传输文件 如果有任何教程、示例或指南可以帮助我理解从多个客户机到单个服务器的文件传输
DWORD WINAPI Network::ServerAcceptConnections(LPVOID lpParam)
{
Network* pNetwork = (Network*) lpParam;
SOCKET new_socket;
char *message;
int c = sizeof(struct sockaddr_in);
DWORD dwWaitResult;
Sleep(100);
while (true)
{
new_socket = accept(pNetwork->m_s , (struct sockaddr *)&pNetwork->m_client, &c);
if (new_socket != INVALID_SOCKET )
{
dwWaitResult = WaitForSingleObject(
pNetwork->m_ClientListMutex, // handle to mutex
INFINITE); // no time-out interval
if (dwWaitResult == WAIT_OBJECT_0)
{
__try
{
//Reply to the client
if (pNetwork->m_clientList.size() < pNetwork->m_maxConnections)
{
if(pNetwork->m_debugModus) printf("DEBUG MODUS: Connection accepted\r\n");
pNetwork->m_clientList.push_back(new_socket);
message = NETWORK_CLASS_CONNECTION_SUCCES;
Message out;
out.client = new_socket;
out.message = message;
out.size = strlen(message);
pNetwork->SendData(out);
}
else
{
if(pNetwork->m_debugModus) printf("DEBUG MODUS: Max connections reached\r\n");
message = NETWORK_CLASS_MAX_CONNECTIONS;
pNetwork->Send(new_socket, message, strlen(message));
closesocket(new_socket);
}
}
__finally {
// Release ownership of the mutex object
if (! ReleaseMutex(pNetwork->m_ClientListMutex))
{
if(pNetwork->m_debugModus) printf("DEBUG MODUS: AcceptConnections: Cant Relese the Mutex\r\n");
}
}
}
else if (dwWaitResult == WAIT_ABANDONED)
{
if(pNetwork->m_debugModus) printf("DEBUG MODUS: SendDataThread: The thread got ownership of an abandoned mutex\r\n");
return FALSE;
}
}
else
{
if(pNetwork->m_debugModus) printf("DEBUG MODUS: accept failed with error code : %d\r\n" , WSAGetLastError());
}
}
return TRUE;
}
DWORD WINAPI网络::服务器接受连接(LPVOID lpParam)
{
网络*pNetwork=(网络*)lpParam;
新插座;
字符*消息;
int c=sizeof(结构sockaddr_in);
德沃德·德韦特结果;
睡眠(100);
while(true)
{
new_socket=accept(pNetwork->m_s,(struct sockaddr*)&pNetwork->m_client,&c);
if(新的\u插槽!=无效的\u插槽)
{
dwWaitResult=WaitForSingleObject(
pNetwork->m_ClientListMutex,//处理互斥
无限);//没有超时间隔
if(dwWaitResult==等待对象0)
{
__试一试
{
//回复客户
if(pNetwork->m_clientList.size()m_maxConnections)
{
if(pNetwork->m_debugModus)printf(“调试方式:已接受连接\r\n”);
pNetwork->m\u clientList.向后推(新的\u套接字);
消息=网络\u类\u连接\u成功;
信息输出;
out.client=新的_套接字;
out.message=消息;
out.size=strlen(消息);
p网络->发送数据(输出);
}
其他的
{
如果(pNetwork->m_debugModus)printf(“DEBUG MODUS:已达到最大连接数\r\n”);
消息=网络\u类\u最大\u连接;
pNetwork->Send(新的_套接字、消息、strlen(消息));
闭合插座(新的_插座);
}
}
__最后{
//释放互斥对象的所有权
如果(!ReleaseMutex(pNetwork->m_ClientListMutex))
{
如果(pNetwork->m_debugModus)printf(“DEBUG MODUS:AcceptConnections:Cant release the Mutex\r\n”);
}
}
}
else if(dwWaitResult==WAIT_放弃)
{
如果(pNetwork->m_debugModus)printf(“DEBUG MODUS:SendDataThread:The thread获得了一个废弃互斥体的所有权\r\n”);
返回FALSE;
}
}
其他的
{
if(pNetwork->m_debugModus)printf(“DEBUG MODUS:accept失败,错误代码:%d\r\n”,WSAGetLastError());
}
}
返回TRUE;
}
-1:阵列应该有多大?那么,为什么要使用数组呢?这取决于应用程序,如果他知道只有10个客户端使用,而更多的客户端使用向量或类似的东西-1:但愿我能投两次反对票。NET具有列表
类型和许多其他可扩展列表。使用数组没有什么价值。为什么要发明新的东西?实现一个FTP服务器,并让客户端连接到它。这方面有成千上万的例子,我不想双向转移。只有客户端可以传输文件,服务器使用db实现将文件按不同的结构进行排序。你们知道吗?你们完全控制了客户端和服务器,对吗。通过客户端上传的文件应该可以通过FTP完美地工作。。您可以禁用服务器中的下载。您有基于C#的FTP服务器和客户端的好例子或教程吗。我可以在谷歌上找到很多这样的网站,但我想听听你的建议。