测试代码客户端
//testSockSrcClose.cpp
#include <iostream>
#include <winsock2.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
// #define PORT 4000
// #define IP_ADDRESS "172.16.4.67"
#define PORT 7890
#define IP_ADDRESS "10.2.33.120"
#define SENDSIZE 1024
DWORD WINAPI Threadmain(LPVOID );
const static int g_threadNum = 10000;
int creatSockErr = 0;
int ConnectErr = 0;
int fopenErr = 0;
int selectErr = 0;
int success = 0;
int sendErr = 0;
int sendtoPeer = 0;
int main()
{
DWORD threadID[g_threadNum];
HANDLE hThread[g_threadNum];
for(int i=0; i<g_threadNum; i++)
{
hThread[i] = CreateThread(NULL,0,Threadmain,&i,0,&threadID[i]); // 创建线程
Sleep(10);
}
for(int i=0; i<g_threadNum; i++)
{
WaitForSingleObject(hThread[i], INFINITE);
//printf("close threadID:%d\n", threadID[i]);
}
for(int i=0; i<g_threadNum; i++)
{
CloseHandle(hThread[i]); // 关闭内核对象
//printf("close threadID:%d\n", threadID[i]);
}
Sleep(1000);
cout<< "creatSockErr: "<<creatSockErr<<endl;
cout<< "ConnectErr: "<<ConnectErr<<endl;
cout<< "fopenErr: "<<fopenErr<<endl;
cout<< "sendto: "<<sendtoPeer<<endl;
cout<< "sendErr: "<<sendErr<<endl;
cout<< "success: "<<success<<endl;
return 0;
}
DWORD WINAPI Threadmain(LPVOID pparam)
{
WSADATA Ws;
SOCKET ClientSocket;
struct sockaddr_in ServerAddr;
int Ret = 0;
char SendBuffer[SENDSIZE];
char RecvBuffer[SENDSIZE];
const char *tt= "sendbuffer";
strcpy(SendBuffer, tt);
//Init Windows Socket
if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
{
cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
creatSockErr++;
return NULL;
}
//Create Socket
ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if ( ClientSocket == INVALID_SOCKET )
{
cout<<"Create Socket Failed::"<<GetLastError()<<endl;
creatSockErr++;
return NULL;
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
ServerAddr.sin_port = htons(PORT);
memset(ServerAddr.sin_zero, 0x00, 8);
Ret = connect(ClientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr));
if ( Ret == SOCKET_ERROR )
{
cout<<"Connect Error::"<<GetLastError()<<endl;
ConnectErr++;
return NULL;
}
else
{
cout<<"连接成功!"<<endl;
}
fd_set readfds;
fd_set writefds;
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_SET(ClientSocket, &readfds);
FD_SET(ClientSocket, &writefds);
struct timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
int iRet = select(0, NULL, &writefds, NULL, &timeout);
if (iRet>0 && FD_ISSET(ClientSocket, &writefds))
{
send(ClientSocket, SendBuffer, strlen(SendBuffer), 0);
}
if ( iRet == SOCKET_ERROR)
{
cout<<"writefds select Info Error::"<<GetLastError()<<endl;
}
iRet = select(0, &readfds, NULL, NULL, &timeout);
if (iRet>0 && FD_ISSET(ClientSocket, &readfds))
{
Ret = recv(ClientSocket, SendBuffer, SENDSIZE, 0);
printf("recv:%s\n", SendBuffer);
}
if ( iRet == SOCKET_ERROR)
{
cout<<"readfds select Info Error::"<<GetLastError()<<endl;
}
FD_CLR(ClientSocket, &writefds);
FD_CLR(ClientSocket, &readfds);
//closesocket(ClientSocket);
//WSACleanup();
return NULL;
}