winsock传文件简单例子
来源:互联网 发布:stc12c5a16s2 编程 编辑:程序博客网 时间:2024/06/06 02:28
服务器端(接收端):
在OnButton中:
void CServerDlg::OnBnClickedButton3(){m_socketListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);//SOCKADDR_INm_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);}}
- winsock传文件简单例子
- winsock一个简单的例子
- 一个简单的Winsock例子
- winsock例子
- winsock IOCP收发例子
- winsock select模型例子
- 简单C++文件读写例子
- java写文件简单例子
- socket简单传输文件例子
- 简单的Winsock例程
- 简单的 winsock tcp
- 简单 Winsock Demo
- C++ Winsock传送文件
- IO读写文件/目录 的简单例子
- vc读xml文件简单例子
- 使用PYTHON3000读写Excel文件简单例子
- dom4j解析xml文件 简单例子
- jdom创建一个xml文件 简单例子
- zend studio配置php手册
- ProE野火4.0+vs2005 Pro/Toolkit 二次开发测试详细教程
- Base64编码
- 统计 text/html 文档类型
- 常用算法(3)-冒泡排序
- winsock传文件简单例子
- (精)hdoj 2922概率
- USACO Training Section 1.2 Name That Number 解题报告&AC代码
- 多线程概述
- 字符串 中的大写变小写.小写变大写
- linux下安装lua环境
- Hibernate 可编程的配置方式
- 人生四行
- 贪心算法解决活动选择问题