事情是這樣的,我同事不知道哪弄了段python的rdp埠嗅探的原始碼,這東西本身其實沒啥技術含量,但他在哪吹噓python比c++寫的快,這我就不能忍了,無非就是開若干個執行緒,起異步socket,分別connect,然后有回傳的判斷回傳是否是需要的。
不過知易行難
,畢竟不是專業寫C++的,socket更不熟悉,網上抄抄改改一兩百行代碼不知bug凡幾。。。問題在哪也不知道
給大家丟臉了
void NThreadProc(void* p);
SOCKET NInitCreateSocket(int nID)
{
SOCKET connfd;
struct sockaddr_in servaddr;
char buff[128];
int n;
//printf("end %d", nPort);
if ((connfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
printf("create socket error: %d(errno: %d)\n", GetLastError(), nID);
return INVALID_SOCKET;
}
unsigned long ul = 1;
int ret = ioctlsocket(connfd, FIONBIO, (unsigned long*)&ul); //設定成非阻塞模式
if (ret == SOCKET_ERROR) //設定失敗
{
printf("create socket error: %d(errno: %d)\n", GetLastError(), nID);
closesocket(connfd);
return INVALID_SOCKET;
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(nID +10333);
if (bind(connfd, (struct sockaddr*) & servaddr, sizeof(servaddr)) == -1) {
printf("bind socket error: %d(errno: %d)\n", GetLastError(), nID);
closesocket(connfd);
return INVALID_SOCKET;
}
DWORD TimeOut = 100;//設定接收超時6秒
if (::setsockopt(connfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&TimeOut, sizeof(TimeOut)) == SOCKET_ERROR) {
closesocket(connfd);
printf("setsockopt error: %d(errno: %d)\n", GetLastError(), nID);
return INVALID_SOCKET;
}
return connfd;
}
int NConnect(SOCKET s,int nPort)
{
if (nPort > 65535)
{
closesocket(s);
if (nPort > 65535)
{
printf("thread %d,end time %d(ms),port %d\n", nPort % g_nCount ,GetTickCount() - g_uStartTime, nPort);
//delete g_SocketList;
//g_SocketList = NULL;
}
return 0;
}
struct sockaddr_in servaddr1;
memset(&servaddr1, 0, sizeof(servaddr1));
servaddr1.sin_family = AF_INET;
servaddr1.sin_port = htons(nPort);
servaddr1.sin_addr.S_un.S_addr = inet_addr(address);
connect(s, (struct sockaddr*) & servaddr1, sizeof(servaddr1));
fd_set writeset;
FD_ZERO(&writeset);
FD_SET(s, &writeset);
timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 10000000;
int ret = select(0, NULL, &writeset, NULL, &tv);
if (ret<= 0)
{
//closesocket(connfd);
NConnect(s, nPort + g_nCount);
return 0;
}
if (send(s, (char*)sendbuf, sizeof(sendbuf), 0) < 0) {
//closesocket(connfd);
NConnect(s, nPort + g_nCount);
printf("send msg error: %d(SOCKET: %d,send port =%d,ret = %d)\n", GetLastError(), s,nPort,ret);
return 0;
}
char buff[128] = {0};
//printf("======waiting for client's request======\n");
while (1) {
int n = recv(s, buff, 128, 0);
//buff[n] = '\0';
//printf("recv msg from client: %s\n", buff);
if(n > 0)
n = CompairType((BYTE*)buff);
if (n > 0)
{
g_port = nPort;
printf("\n port =%d,type %d\n", nPort, n);
printf("\n port =%d,type %d\n", nPort, n);
}
else
{
NConnect(s, nPort + g_nCount);
}
return 0;
}
}
int NInit(int nCount)
{
g_nCount = nCount;
g_SocketList = new SOCKET[nCount];
for (int i = 0; i < nCount; i++)
{
g_SocketList[i] = NInitCreateSocket(i);
}
printf("start time %d\n", g_uStartTime = GetTickCount());
for (int i = 0; i < nCount; i++)
{
POINT* pt = new POINT;
pt->x = g_SocketList[i];
pt->y = i;
_beginthread(NThreadProc, sizeof(POINT), pt);
}
return 0;
}
void NThreadProc(void* p)
{
POINT* p1 = (POINT*)p;
NConnect(p1->x,p1->y);
}
int main(int argc ,char** argv)
{
WSADATA a;
WSAStartup(MAKEWORD(1,0),&a);
/*int nPort = 80;
int nTime1 = GetTickCount();
for (int i = 0; i < 1000; i++)
{
int* a = new int[1];
a[0] = i;
_beginthread(ThreadProc,sizeof(int),a);
}
int nTime2 = GetTickCount();
printf("start time %d\n", nTime2);*/
NInit(100);
getchar();
WSACleanup();
}
uj5u.com熱心網友回復:
UINT g_uStartTime = 0;
UINT g_uEndTime = 0;
int g_nCount = 0;
SOCKET* g_SocketList = NULL;
把全域貼一下
我原來是起1000個執行緒,發現80結束的很快(80,1080,2080......66080)不知道為啥?
然后除錯的時候發現定33X9條件斷點不進入

各種奇怪問題,而且如果我從89開始跟,33X9能被檢測到,但是不下斷就無法被檢測到
懷疑是超時設定的問題,但不能確定
uj5u.com熱心網友回復:
33X9是敏感詞?X=8uj5u.com熱心網友回復:
嗯,看了一下資料,看明白了,connect 得判斷WSAEWOULDBLOCK,然后要重用得disconnectex,要不然就close掉再重新開辟,
雖然怎么寫還不會,不過大概知道錯在哪了
uj5u.com熱心網友回復:
異步Connect以后,可以使用 select 查看可寫狀態, Connect成功后socket 會變成可寫(可發送狀態)
//聯機到服務器
BOOL bConnectOK = FALSE;
{
SOCKADDR_IN server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(m_dwServerIPAddr);
server.sin_port = htons((WORD)m_dwServerPort);
int iconnect = connect(m_CommSock, (struct sockaddr*)&server, sizeof(server));
if(iconnect == 0) //直接成功
{
bConnectOK = 1;
break;
}
fd_set writefds;
FD_ZERO(&writefds);
FD_SET(m_CommSock, &writefds);
timeval tOut = {1, 0};
if( select(0, NULL, &writefds, NULL, &tOut) > 0 && FD_ISSET(m_CommSock, &writefds) )
{
bConnectOK = 2;
break;
}
}while(0);
uj5u.com熱心網友回復:

還要檢查下win下的最大連接并發數。比如以前xp默認最大10.
uj5u.com熱心網友回復:
你這不對吧?異步socket會直接回傳true嗎?

通篇求得其實是異步socket如何重用,因為是客戶端,connectex之后不知如何斷開連接并重用,直接disconnectex再connect會報10022
uj5u.com熱心網友回復:
和這個沒關系吧?電腦是server 2008并無限制。通篇求得其實是異步socket如何重用,因為是客戶端,connectex之后不知如何斷開連接并重用,直接disconnectex再connect會報10022
uj5u.com熱心網友回復:
關鍵在下面的 select 上
uj5u.com熱心網友回復:
lz應該明白,多執行緒應用并不是執行緒越多就越快,因為執行緒本質就是時間片。如果你的CPU只有一個核,那么原理上,對于相同的任務做成多執行緒執行肯定不會比單執行緒執行快!!!因為,多執行緒就需要耗費好多的資源用于執行緒調度,并且多執行緒之間往往需要需要執行緒同步而必須將資料鎖定。。。win環境下winsock應用最經典的應用是IOCP(完成埠),使用的是執行緒池,執行緒池的執行緒數量一般限制在CPU的核心數的2倍,再多的執行緒就沒有意義,再多就會降低整體的執行效率
uj5u.com熱心網友回復:
你同學說python比C++寫的快也沒問題的,C++本來就寫的慢,只是運行起來快,python都是包裝好的肯定快了。不能否認python寫東西快,只是效率嘛就看需要了。uj5u.com熱心網友回復:
異步Connect以后,可以使用 select 查看可寫狀態, Connect成功后socket 會變成可寫(可發送狀態)
//聯機到服務器
BOOL bConnectOK = FALSE;
{
SOCKADDR_IN server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(m_dwServerIPAddr);
server.sin_port = htons((WORD)m_dwServerPort);
int iconnect = connect(m_CommSock, (struct sockaddr*)&server, sizeof(server));
if(iconnect == 0) //直接成功
{
bConnectOK = 1;
break;
}
fd_set writefds;
FD_ZERO(&writefds);
FD_SET(m_CommSock, &writefds);
timeval tOut = {1, 0};
if( select(0, NULL, &writefds, NULL, &tOut) > 0 && FD_ISSET(m_CommSock, &writefds) )
{
bConnectOK = 2;
break;
}
}while(0);
你這不對吧?異步socket會直接回傳true嗎?
通篇求得其實是異步socket如何重用,因為是客戶端,connectex之后不知如何斷開連接并重用,直接disconnectex再connect會報10022
關鍵在下面的 select 上
不是,我不是這個問題,我現在那段代碼的問題是初始化和connect第一次運行是沒問題的,select之后沒得到結果或者得到結果了進入recv后我socket并不想close掉,想回圈再利用當前socket換個埠再次conect的時候報錯10022,看網上說的是需要先disconnectex,但那是服務端的邏輯吧?我這個就是個客戶端
uj5u.com熱心網友回復:
lz應該明白,多執行緒應用并不是執行緒越多就越快,因為執行緒本質就是時間片。如果你的CPU只有一個核,那么原理上,對于相同的任務做成多執行緒執行肯定不會比單執行緒執行快!!!因為,多執行緒就需要耗費好多的資源用于執行緒調度,并且多執行緒之間往往需要需要執行緒同步而必須將資料鎖定。。。
win環境下winsock應用最經典的應用是IOCP(完成埠),使用的是執行緒池,執行緒池的執行緒數量一般限制在CPU的核心數的2倍,再多的執行緒就沒有意義,再多就會降低整體的執行效率
效率可后面再考慮,我現在想知道的就是socket如何重用,客戶端connect之后如何不closesocket換個埠仍能connnect
uj5u.com熱心網友回復:
你同學說python比C++寫的快也沒問題的,C++本來就寫的慢,只是運行起來快,python都是包裝好的肯定快了。不能否認python寫東西快,只是效率嘛就看需要了。
python寫起來肯定比c++快,這個沒問題,反對的是python跑起來比c++快
uj5u.com熱心網友回復:
你同學說python比C++寫的快也沒問題的,C++本來就寫的慢,只是運行起來快,python都是包裝好的肯定快了。不能否認python寫東西快,只是效率嘛就看需要了。
python寫起來肯定比c++快,這個沒問題,反對的是python跑起來比c++快
這問題還用爭嗎,能說出這樣的話說明水平還太次。你跟他爭論這個問題本身就錯了,這問題根本就不需要爭論。
uj5u.com熱心網友回復:
你同學說python比C++寫的快也沒問題的,C++本來就寫的慢,只是運行起來快,python都是包裝好的肯定快了。不能否認python寫東西快,只是效率嘛就看需要了。
python寫起來肯定比c++快,這個沒問題,反對的是python跑起來比c++快
應該是disconnect后,可以回收重用
uj5u.com熱心網友回復:
你同學說python比C++寫的快也沒問題的,C++本來就寫的慢,只是運行起來快,python都是包裝好的肯定快了。不能否認python寫東西快,只是效率嘛就看需要了。
python寫起來肯定比c++快,這個沒問題,反對的是python跑起來比c++快
應該是disconnect后,可以回收重用
有沒有異步disconnect的示例
uj5u.com熱心網友回復:
你同學說python比C++寫的快也沒問題的,C++本來就寫的慢,只是運行起來快,python都是包裝好的肯定快了。不能否認python寫東西快,只是效率嘛就看需要了。
python寫起來肯定比c++快,這個沒問題,反對的是python跑起來比c++快
這問題還用爭嗎,能說出這樣的話說明水平還太次。你跟他爭論這個問題本身就錯了,這問題根本就不需要爭論。
當然需要爭論,就好比不會卸汽車輪胎的人你問他是用氣槍快還是用扳手快,他不會用工具也沒見到工具的前提條件下用哪個快,怎么不需要爭論。我倆主業搞翻譯的業余愛好者,爭論的自然是我能不能用c寫的比他python那段代碼快,而不是你們專業搞軟體的來寫。
uj5u.com熱心網友回復:
你同學說python比C++寫的快也沒問題的,C++本來就寫的慢,只是運行起來快,python都是包裝好的肯定快了。不能否認python寫東西快,只是效率嘛就看需要了。
python寫起來肯定比c++快,這個沒問題,反對的是python跑起來比c++快
這問題還用爭嗎,能說出這樣的話說明水平還太次。你跟他爭論這個問題本身就錯了,這問題根本就不需要爭論。
當然需要爭論,就好比不會卸汽車輪胎的人你問他是用氣槍快還是用扳手快,他不會用工具也沒見到工具的前提條件下用哪個快,怎么不需要爭論。我倆主業搞翻譯的業余愛好者,爭論的自然是我能不能用c寫的比他python那段代碼快,而不是你們專業搞軟體的來寫。
業余用python
專業用C
運行速度由快到慢:匯編 、C、C++、其他再經封裝的高級語言(如phthon)
開發效率由高到低 :高級封裝的語言(如python)、C++、C、匯編
uj5u.com熱心網友回復:
你同學說python比C++寫的快也沒問題的,C++本來就寫的慢,只是運行起來快,python都是包裝好的肯定快了。不能否認python寫東西快,只是效率嘛就看需要了。
python寫起來肯定比c++快,這個沒問題,反對的是python跑起來比c++快
這問題還用爭嗎,能說出這樣的話說明水平還太次。你跟他爭論這個問題本身就錯了,這問題根本就不需要爭論。
當然需要爭論,就好比不會卸汽車輪胎的人你問他是用氣槍快還是用扳手快,他不會用工具也沒見到工具的前提條件下用哪個快,怎么不需要爭論。我倆主業搞翻譯的業余愛好者,爭論的自然是我能不能用c寫的比他python那段代碼快,而不是你們專業搞軟體的來寫。
業余用python
專業用C
運行速度由快到慢:匯編 、C、C++、其他再經封裝的高級語言(如phthon)
開發效率由高到低 :高級封裝的語言(如python)、C++、C、匯編
python之類的好幾種常規開發語言我都會一點,只不過不是主業,也不做網路方面的東西所以不熟,不討論這個了,我就求一個異步socket重用的示例,得能通過。
uj5u.com熱心網友回復:
你同學說python比C++寫的快也沒問題的,C++本來就寫的慢,只是運行起來快,python都是包裝好的肯定快了。不能否認python寫東西快,只是效率嘛就看需要了。
python寫起來肯定比c++快,這個沒問題,反對的是python跑起來比c++快
這問題還用爭嗎,能說出這樣的話說明水平還太次。你跟他爭論這個問題本身就錯了,這問題根本就不需要爭論。
當然需要爭論,就好比不會卸汽車輪胎的人你問他是用氣槍快還是用扳手快,他不會用工具也沒見到工具的前提條件下用哪個快,怎么不需要爭論。我倆主業搞翻譯的業余愛好者,爭論的自然是我能不能用c寫的比他python那段代碼快,而不是你們專業搞軟體的來寫。
業余用python
專業用C
運行速度由快到慢:匯編 、C、C++、其他再經封裝的高級語言(如phthon)
開發效率由高到低 :高級封裝的語言(如python)、C++、C、匯編
我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色我在你爹墳頭蹦迪順便搓把麻將還能清一色
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/20109.html
標籤:網絡編程
