Socket 服务器端编程问题 本帖最后由 oyljerry 于 2014-12-09 16:54:21 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //监听客户端请求线程UINT __cdecl _ThreadFile(LPVOID pPM){ g_sockSever = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建服务套接字(TCP) SOCKADDR_IN ServerAddr; //分配端口及协议族并绑定 ServerAddr.sin_family=AF_INET; ServerAddr.sin_addr.S_un.S_addr =htonl(INADDR_ANY); ServerAddr.sin_port=htons(PORT); int nRet=bind(g_sockSever,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr)); // 绑定套接字 if(nRet==SOCKET_ERROR) { ServerAddr.sin_port=htons(PORT+1); TRACE( _T("端口冲突,换一个.\n")); bind(g_sockSever,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr)); // 再次绑定套接字 } nRet=listen(g_sockSever,64); //开始监听,并设置监听客户端数量 if(nRet==SOCKET_ERROR) { AfxMessageBox(L"监听出错!"); return FALSE; } AfxMessageBox(L"服务器启动成功,开始监听了"); SOCKADDR_IN ClientAddr; // 定义一个客户端得地址结构作为参数 int addr_length=sizeof(ClientAddr); while(TRUE) { SOCKET m_sockComm = accept(g_sockSever,(SOCKADDR *)&ClientAddr, &addr_length); if( m_sockComm==SOCKET_ERROR ) { break; } CString pSendMsg=L"这是一条来自服务器的消息"; nRet=send(m_sockComm, (LPSTR)(LPCTSTR)pSendMsg, pSendMsg.GetLength()*2, 0); if(nRet == SOCKET_ERROR) { TRACE(L"%d", WSAGetLastError()); } //char pRevMsg[50001]={0}; //nRet = recv(m_sockComm, pRevMsg, 50000, 0); //FILE *fpWrite = NULL; //fpWrite = fopen("1.jpg","wb"); //fwrite(pRevMsg,nRet,1,fpWrite); //fclose(fpWrite); } return 0;} 建议你使用CxUdpSockethttp://www.cnblogs.com/EdmundDwyane/p/3218838.htmlCxClientSockethttp://www.cnblogs.com/EdmundDwyane/p/3248297.htmlCxServerSockethttp://www.cnblogs.com/EdmundDwyane/p/3278641.html 1.accept本来就是阻塞的,你理应放入线程中去accept2.你放入线程出错退出,具体代码没贴,不太清楚情况,你要把错误贴上来,建议是不要在线程使用CSocket3.1L代码可用,你试试看4.客户端断开重连也没有数据,你检查检查你的客户端socket是否有问题,拿WSAGetLastError获取错误码去看描述,错误码查看工具是ErrorLookup DWORD dwThreadId; HANDLE hThread; //全局变量DWORD WINAPI AnswerThread(LPVOID lp) //线程函数{ CXMLTestDlg *p = (CXMLTestDlg*)lp; while(1) { p->listenSocket->Accept(* (p->mySocket)); } return 0;}//连接按钮中启动线程listenSocket->Create(m_iPort);listenSocket->Listen(1);hThread =CreateThread(NULL,NULL,AnswerThread,this,0,&dwThreadId); DWORD dwThreadId; HANDLE hThread; //全局变量DWORD WINAPI AnswerThread(LPVOID lp) //线程函数{ CXMLTestDlg *p = (CXMLTestDlg*)lp; while(1) { p->listenSocket->Accept(* (p->mySocket)); } return 0;}//连接按钮中启动线程listenSocket->Create(m_iPort);listenSocket->Listen(1);hThread =CreateThread(NULL,NULL,AnswerThread,this,0,&dwThreadId);建议楼主不要在线程中使用CSocket,之前我在线程中使用CSokect时,会出现很多莫名其妙的问题,CSockey如果当真要使用,必须把创建监听等函数的调用全部放在一个线程里,跨线程有问题,这里也提到了http://blog.csdn.net/hgy413/article/details/6202979 使用SetPixel速度太慢的问题 关于QQ对键盘钩子干扰的问题 COM中如何将BSTR输出到文本文件 要和女友分手了! 今天一同事问我scanf("%02x",&a);中的02是什么意思?特来VC版求教! GetCurrentDirectory的问题? 关于系统钩子的问题。 求高手帮忙!! vc6如何调用VS2005 C#写的DLL?急问 如何将一个字节各位反过来???!!!!!!!!!! 在点击确定之后能后把我输入的数据存到数据库里, CListCtrl控件的问题
UINT __cdecl _ThreadFile(LPVOID pPM)
{
g_sockSever = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建服务套接字(TCP) SOCKADDR_IN ServerAddr; //分配端口及协议族并绑定 ServerAddr.sin_family=AF_INET;
ServerAddr.sin_addr.S_un.S_addr =htonl(INADDR_ANY);
ServerAddr.sin_port=htons(PORT); int nRet=bind(g_sockSever,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr)); // 绑定套接字
if(nRet==SOCKET_ERROR)
{
ServerAddr.sin_port=htons(PORT+1);
TRACE( _T("端口冲突,换一个.\n"));
bind(g_sockSever,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr)); // 再次绑定套接字
} nRet=listen(g_sockSever,64); //开始监听,并设置监听客户端数量
if(nRet==SOCKET_ERROR)
{
AfxMessageBox(L"监听出错!");
return FALSE;
} AfxMessageBox(L"服务器启动成功,开始监听了"); SOCKADDR_IN ClientAddr; // 定义一个客户端得地址结构作为参数
int addr_length=sizeof(ClientAddr); while(TRUE)
{
SOCKET m_sockComm = accept(g_sockSever,(SOCKADDR *)&ClientAddr, &addr_length);
if( m_sockComm==SOCKET_ERROR )
{
break;
} CString pSendMsg=L"这是一条来自服务器的消息";
nRet=send(m_sockComm,
(LPSTR)(LPCTSTR)pSendMsg,
pSendMsg.GetLength()*2, 0); if(nRet == SOCKET_ERROR)
{
TRACE(L"%d", WSAGetLastError());
}
//char pRevMsg[50001]={0};
//nRet = recv(m_sockComm, pRevMsg, 50000, 0);
//FILE *fpWrite = NULL;
//fpWrite = fopen("1.jpg","wb"); //fwrite(pRevMsg,nRet,1,fpWrite);
//fclose(fpWrite); }
return 0;
}
CxUdpSocket
http://www.cnblogs.com/EdmundDwyane/p/3218838.html
CxClientSocket
http://www.cnblogs.com/EdmundDwyane/p/3248297.html
CxServerSocket
http://www.cnblogs.com/EdmundDwyane/p/3278641.html
2.你放入线程出错退出,具体代码没贴,不太清楚情况,你要把错误贴上来,建议是不要在线程使用CSocket
3.1L代码可用,你试试看
4.客户端断开重连也没有数据,你检查检查你的客户端socket是否有问题,拿WSAGetLastError获取错误码去看描述,错误码查看工具是ErrorLookup
DWORD dwThreadId;
HANDLE hThread; //全局变量
DWORD WINAPI AnswerThread(LPVOID lp) //线程函数
{
CXMLTestDlg *p = (CXMLTestDlg*)lp;
while(1)
{
p->listenSocket->Accept(* (p->mySocket));
}
return 0;
}//连接按钮中启动线程
listenSocket->Create(m_iPort);
listenSocket->Listen(1);
hThread =CreateThread(NULL,NULL,AnswerThread,this,0,&dwThreadId);
DWORD dwThreadId;
HANDLE hThread; //全局变量
DWORD WINAPI AnswerThread(LPVOID lp) //线程函数
{
CXMLTestDlg *p = (CXMLTestDlg*)lp;
while(1)
{
p->listenSocket->Accept(* (p->mySocket));
}
return 0;
}//连接按钮中启动线程
listenSocket->Create(m_iPort);
listenSocket->Listen(1);
hThread =CreateThread(NULL,NULL,AnswerThread,this,0,&dwThreadId);
建议楼主不要在线程中使用CSocket,之前我在线程中使用CSokect时,会出现很多莫名其妙的问题,CSockey如果当真要使用,必须把创建监听等函数的调用全部放在一个线程里,跨线程有问题,这里也提到了
http://blog.csdn.net/hgy413/article/details/6202979