CSocket如何实现多线程连接客户端 大意如题,希望高手能具体给点代码演示! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不要把CSOCKET放到线程处理会堵塞的如果要用原始SOCKET CSocket要派生子类来用的,看看MSDN有没例子而原始套接字就不规定你找些例子看看想快速开发CSOCKET想了解深入原始套接字 你还是到www.vckbase.com下些程序看吧·········郁闷,围观新人 #include <winsock2.h>#include <stdio.h>#include <windows.h>#include <iostream.h>#pragma comment(lib,"WS2_32")DWORD WINAPI ThreadAcceptProc( LPVOID lpParameter);void main(){//====================================主线程=========================================== int i=1; WORD mVersionRequested; mVersionRequested=MAKEWORD(2,2); WSADATA wsaData; SOCKET sListen,sAccept; if (WSAStartup(mVersionRequested,&wsaData)!=0) { printf("WSAStartup Failed, Error: %d\n",WSAGetLastError()); WSACleanup(); } if (LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2) { printf("The version is not fit !"); WSACleanup(); } sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //创建监听口 sockaddr_in addrSer; addrSer.sin_addr.s_addr=inet_addr("192.168.66.11"); addrSer.sin_family=AF_INET; addrSer.sin_port=htons(8000); if (SOCKET_ERROR==bind(sListen,(sockaddr*)&addrSer,sizeof(addrSer))) //绑定监听口 { printf("Bind Failed, Error: %d\n",WSAGetLastError()); closesocket(sListen); } else { printf("主机IP:[%s],PORT: [%d]\n",inet_ntoa(addrSer.sin_addr),htons(addrSer.sin_port)); } u_long iMode=0; ioctlsocket(sListen, FIONBIO, &iMode); //非阻塞模式 非0,阻塞模式0 if (SOCKET_ERROR!=listen(sListen,1)) { printf("正在监听中....\n"); } sockaddr_in addrCli; int iLen=sizeof(addrCli); HANDLE hAccept; while (true) { sAccept=accept(sListen,(sockaddr*)&addrCli,&iLen); if(INVALID_SOCKET==sAccept) {// printf("接收失败...\n"); } else { printf("Clien%d的IP为:%s, PORT为:%d\n",i,inet_ntoa(addrCli.sin_addr),\ ntohs(addrCli.sin_port)); hAccept=CreateThread(NULL,0,ThreadAcceptProc,NULL,0,NULL); i++; } }}DWORD WINAPI ThreadAcceptProc( LPVOID lpParameter){ //recvfrom() //==========================于此设置接收与发送================================ return 0;}//=========================================Listen监听线程==================================================//=================================================================================================// HANDLE hThreadListen;// hThreadListen=CreateThread(NULL,0,ThreadListenProc,(LPVOID)sListen,0,NULL); //监听线程// Sleep(1000);// while (1)// {// AcceptData *pAcceptParam=new AcceptData;// pAcceptParam->sList=sListen;// // // sockaddr_in ad;// HANDLE hThreadAccept=CreateThread(NULL,0,ThreadAcceptProc,(LPVOID)pAcceptParam,0,NULL);//接收线程// SetThreadPriority(hThreadAccept,THREAD_PRIORITY_HIGHEST); // ad=((AcceptData *)pAcceptParam)->addrC;// printf("Accepted Client%d IP:[%s],port:[%d]\n",i,inet_ntoa(ad.sin_addr),\// ntohs(ad.sin_port));// // i++;// //发送信息// char buf[]="I am server !";// int iSend=send(sAccept,buf,sizeof(buf),0);// if (iSend==SOCKET_ERROR)// {// printf("Send Failed,Error: %d\n",WSAGetLastError());// break;// }// else if (iSend==0)// {// break;// }// else// {// printf("Send total byte is %d\n",iSend);// printf("---------------------\n");// }// closesocket(sAccept);/* }*//* } closesocket(sListen); WSACleanup();}// 0x0040dd8fDWORD WINAPI ThreadListenProc( LPVOID lpParameter ){ SOCKET sLis=(SOCKET)lpParameter; if (SOCKET_ERROR==listen(sLis,1)) { printf("Listen Failed, Error: %d\n",WSAGetLastError()); closesocket(sLis); return 0; } else { printf("正在监听中......!"); } return 1;}DWORD WINAPI ThreadAcceptProc( LPVOID lpParameter ){ SOCKET ss=((AcceptData*)lpParameter)->sList; sockaddr_in addrCli; int iLen=sizeof(addrCli); SOCKET sAccept=accept(ss,(sockaddr*)&addrCli,&iLen); if (INVALID_SOCKET==sAccept) { printf("Accept Failed, Error: %d\n",WSAGetLastError()); closesocket(sAccept); //break; } else { printf("接受成功...."); } //输出客户IP地址和端口号 printf("Accepted Client%d IP:[%s],port:[%d]\n",i,inet_ntoa(addrCli.sin_addr),\ ntohs(addrCli.sin_port)); i++; return 1;}*/ 谢谢这位大哥,要是用CSocket类实现的就好了! CSocket那玩意给新手玩玩还可以,封装的实在太简陋。 那用MFC实现多线程的Socket连接,该使用什么方法呢? VC 基于对话框 只 运行一个实例 为什么SendMessage没有用!!! 50分:我应该如何设计---在程序中使用另写的目标函数??? 看过深入浅出mfc的同志进来看一下。 想跳槽,狂散分,大家帮我参考一下,来者有分,不够再加。 请教如何拦截内嵌到网页中的 FLASH 通讯内容 请各位看一下这个程序,帮助修改一下. 请问哪里有vs studio 6.0下载 VC中使用Combo Box的问题! socket的问题。 warning C4311: “类型转换”: 从“HMENU”到“UINT”的指针截断 如何在天空 华军 提升 下载量提升 下载作弊 HTTP高手请进
用原始SOCKET
而原始套接字就不规定你找些例子看看
想快速开发CSOCKET
想了解深入原始套接字
#include <stdio.h>
#include <windows.h>
#include <iostream.h>
#pragma comment(lib,"WS2_32")
DWORD WINAPI ThreadAcceptProc( LPVOID lpParameter);
void main()
{
//====================================主线程===========================================
int i=1;
WORD mVersionRequested;
mVersionRequested=MAKEWORD(2,2);
WSADATA wsaData;
SOCKET sListen,sAccept;
if (WSAStartup(mVersionRequested,&wsaData)!=0)
{
printf("WSAStartup Failed, Error: %d\n",WSAGetLastError());
WSACleanup();
}
if (LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
{
printf("The version is not fit !");
WSACleanup();
}
sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //创建监听口
sockaddr_in addrSer;
addrSer.sin_addr.s_addr=inet_addr("192.168.66.11");
addrSer.sin_family=AF_INET;
addrSer.sin_port=htons(8000);
if (SOCKET_ERROR==bind(sListen,(sockaddr*)&addrSer,sizeof(addrSer))) //绑定监听口
{
printf("Bind Failed, Error: %d\n",WSAGetLastError());
closesocket(sListen);
}
else
{
printf("主机IP:[%s],PORT: [%d]\n",inet_ntoa(addrSer.sin_addr),htons(addrSer.sin_port));
}
u_long iMode=0;
ioctlsocket(sListen, FIONBIO, &iMode); //非阻塞模式 非0,阻塞模式0
if (SOCKET_ERROR!=listen(sListen,1))
{
printf("正在监听中....\n");
}
sockaddr_in addrCli;
int iLen=sizeof(addrCli);
HANDLE hAccept;
while (true)
{
sAccept=accept(sListen,(sockaddr*)&addrCli,&iLen);
if(INVALID_SOCKET==sAccept)
{
// printf("接收失败...\n");
}
else
{
printf("Clien%d的IP为:%s, PORT为:%d\n",i,inet_ntoa(addrCli.sin_addr),\
ntohs(addrCli.sin_port));
hAccept=CreateThread(NULL,0,ThreadAcceptProc,NULL,0,NULL);
i++;
}
}
}
DWORD WINAPI ThreadAcceptProc( LPVOID lpParameter)
{
//recvfrom()
//==========================于此设置接收与发送================================
return 0;
}//=========================================Listen监听线程==================================================
//=================================================================================================
// HANDLE hThreadListen;
// hThreadListen=CreateThread(NULL,0,ThreadListenProc,(LPVOID)sListen,0,NULL); //监听线程
// Sleep(1000);
// while (1)
// {
// AcceptData *pAcceptParam=new AcceptData;
// pAcceptParam->sList=sListen;
//
// // sockaddr_in ad;
// HANDLE hThreadAccept=CreateThread(NULL,0,ThreadAcceptProc,(LPVOID)pAcceptParam,0,NULL);//接收线程// SetThreadPriority(hThreadAccept,THREAD_PRIORITY_HIGHEST);
// ad=((AcceptData *)pAcceptParam)->addrC;
// printf("Accepted Client%d IP:[%s],port:[%d]\n",i,inet_ntoa(ad.sin_addr),\
// ntohs(ad.sin_port));
//
// i++;
// //发送信息
// char buf[]="I am server !";
// int iSend=send(sAccept,buf,sizeof(buf),0);
// if (iSend==SOCKET_ERROR)
// {
// printf("Send Failed,Error: %d\n",WSAGetLastError());
// break;
// }
// else if (iSend==0)
// {
// break;
// }
// else
// {
// printf("Send total byte is %d\n",iSend);
// printf("---------------------\n");
// }
// closesocket(sAccept);
/* }*/
/* }
closesocket(sListen);
WSACleanup();
}
// 0x0040dd8f
DWORD WINAPI ThreadListenProc(
LPVOID lpParameter
)
{
SOCKET sLis=(SOCKET)lpParameter;
if (SOCKET_ERROR==listen(sLis,1))
{
printf("Listen Failed, Error: %d\n",WSAGetLastError());
closesocket(sLis);
return 0;
}
else
{
printf("正在监听中......!");
}
return 1;
}DWORD WINAPI ThreadAcceptProc(
LPVOID lpParameter
)
{
SOCKET ss=((AcceptData*)lpParameter)->sList;
sockaddr_in addrCli;
int iLen=sizeof(addrCli);
SOCKET sAccept=accept(ss,(sockaddr*)&addrCli,&iLen);
if (INVALID_SOCKET==sAccept)
{
printf("Accept Failed, Error: %d\n",WSAGetLastError());
closesocket(sAccept);
//break;
}
else
{
printf("接受成功....");
}
//输出客户IP地址和端口号
printf("Accepted Client%d IP:[%s],port:[%d]\n",i,inet_ntoa(addrCli.sin_addr),\
ntohs(addrCli.sin_port));
i++;
return 1;
}
*/