服务器端(接收端):
在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);
}
}