最近想弄一个可以实现多线程并发连接的程序,用VC实现,可是网上没有现成的多线程并发源码,我只好自己做一个。我开始一直不知道怎么弄,后来在看一个帖子的时候,有一句话提醒了我:“Accept函数会返回一个新的SOCKET连接。”(大意是这样哈)。
说到这你可能已经会了。灵感就在一瞬间啊!我以前怎么没有注意到呢?
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")
DWORD _stdcall Thread_1 ( LPVOID lpParameter )
{
SOCKET Conn = (SOCKET)lpParameter;
while(1)
{
send(Conn,"Hello!\n",8,0);
Sleep(1000);
}
closesocket(Conn);
return 0;
}
int main()
{
WSADATA wsaData;
WSAStartup( MAKEWORD( 2, 2 ), &wsaData );SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(80); //我用的是80端口,大家最好不要用
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
CreateThread(NULL,0,Thread_1,(LPVOID)sockConn,0,NULL); //将新的SOCKET传给线程
}return 0;
}
搞定!用telnet测试一下!
注:再将这些代码扩展之后,使用telnet连接,在异常断开SOCKET连接时可能会导致程序自动关闭,不知道怎么回事。