winsock传文件简单例子

服务器端(接收端):

在OnButton中:

void CServerDlg::OnBnClickedButton3()
{
	m_socketListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
	//SOCKADDR_IN
	m_addr.sin_family = AF_INET;
	m_addr.sin_addr.S_un.S_addr = INADDR_ANY;
	m_addr.sin_port = htons(m_iValue);
	
	if (bind(m_socketListen, (LPSOCKADDR)&m_addr, sizeof(m_addr)) == SOCKET_ERROR)
	{
		MessageBox(_T("bind error!"));
	}
	if (listen(m_socketListen, 2) == SOCKET_ERROR)
	{
		MessageBox(_T("listen error!"));
	}
	//m_socketClient = accept(m_socketListen, NULL, NULL);
	HANDLE hThread = NULL;   
	unsigned threadID = 0;

	//g_h = this;
	//   Create   the   second   thread.   
	hThread   =   (HANDLE)_beginthreadex(NULL, 0, SecondThreadFunc, (void*)m_socketListen, 0, &threadID);   //NULL表示无传递参数
	//   Wait   until   second   thread   terminates.   If   you   comment   out   the   line   
	//   below,   Counter   will   not   be   correct   because   the   thread   has   not   
	//   terminated,   and   Counter   most   likely   has   not   been   incremented   to   
	//   1000000   yet.   
	//WaitForSingleObject(hThread, INFINITE);     
	//   Destroy   the   thread   object.
	
	CloseHandle(hThread); 
}


发送线程的过程函数:

unsigned __stdcall CServerDlg::SecondThreadFunc(void* param)
{
	SOCKET sListen = (SOCKET)param;
	char buff[1024] = {0};
	SOCKET s;
	int ret = 0;
	FILE *fp = NULL;
	//打开一个文件,准备写入
	if (!(fp = fopen("c:\\1.rar", "wb")))
	{
		::MessageBox(NULL, _T("open file failed!"), NULL, 0);
	}
	while (1)
	{
		//准备接受数据
		s = accept(sListen, NULL, NULL);

		if (!s)
		{
			break;
		}
		else
		{
			//设置超时时间
			int iTimeOut = 10000;
			ret = setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *)iTimeOut, sizeof(iTimeOut));
			if(ret != 0)
			{
				::MessageBox(NULL, _T("setsockopt error"), 0, 0);
				break;
			}
		}
		do 
		{	
			//接受数据
			time_t oldTime = time(NULL);
			ret = recv(s, buff, 1024, 0);
			//最后一次接受的数据是"over"
			if (0 == strcmp(buff, "Over"))
			{
				//通知发送端全部接收完毕
				send(s, "received!", 10, 0);
				break;
			}
			else
			{
				//把数据写入打开的文件
				fwrite(buff, 1, ret, fp);
				SecureZeroMemory(buff, sizeof(buff));
			}
		} while (ret > 0);

		if (fp)
		{
			//关闭文件
			fclose(fp);
			fp = NULL;
		}
		closesocket(s);
		s = NULL;
		break;
	}
	return 0;
}

----------------------------------------------------------------------------------------------------------

客户端(发送端):

客户端没有想服务器端一样开一个线程来传数据,所以界面会无响应.


void CClientDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码


	m_socketServer = socket(AF_INET, SOCK_STREAM,0);

	m_addr.sin_family = AF_INET;
	m_addr.sin_addr.S_un.S_addr = inet_addr("192.168.1.100");
	m_addr.sin_port = htons(1999);

	int ret = 0;
	int error = 0;
	ret = connect(m_socketServer, (LPSOCKADDR)&m_addr, sizeof(m_addr));
	if(ret != 0)
	{
		MessageBox(_T("connect error"));
		return ;
	}

	int iTimeOut = 10000;
	ret = setsockopt(m_socketServer, SOL_SOCKET, SO_SNDTIMEO, (char *)iTimeOut, sizeof(iTimeOut));
	if(ret != 0)
	{
		MessageBox(_T("setsockopt error"));
		return ;
	}
// 	char szTemp[256] = {0};
// 	WCharToMByte(m_strEdit, szTemp, 256);


	FILE *fp = NULL;
	if ((fp = fopen("F:\\TDDOWNLOAD\\1.txt", "rb+")))
	{
		char szBuff[1024+1] = {0};
		//读取文件
		int i = fread(szBuff, 1, 1024, fp);
		while (i > 0)
		{
			//发送数据和读文件
			ret = send(m_socketServer, szBuff/*szTemp*/, i, 0);
			SecureZeroMemory(szBuff, sizeof(szBuff));
			i = fread(szBuff, 1, 1024, fp);
		}
		if (ferror(fp))
		{
			MessageBox(_T("fread error"));
		}
		if(feof(fp))
		{
			//一下几行可以获得错误信息的描述
			// 		LPVOID lpMsgBuf;
			// 		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,0, WSAGetLastError()/*GetLastError()*/, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
			// 		//显示
			// 		MessageBox((LPCTSTR)lpMsgBuf, _T("GetLastError"), MB_OK|MB_ICONINFORMATION );
			// 
			// 		//释放内存
			// 		::LocalFree( lpMsgBuf);
			fclose(fp);
			//MessageBox(_T("Send data Over"));
		}
		//告诉服务器数据发送完毕
		send(m_socketServer, "Over", 4, 0);
	}
	else
	{
		return ;
	}
	//接收通知 (服务器接收完毕)
	char buff[11] = {0};
	ret = recv(m_socketServer, buff, 10, 0);
	if(ret == 0){
		TRACE("Recv data error: %d\n", WSAGetLastError());
		return ;
	}
	if (buff[0])
	{
		MessageBoxA(NULL, buff, NULL, 0);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值