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);}}


原创粉丝点击