我正在尝试为多个套接字客户端构建模拟。 我的服务器具有以下代码来侦听多个客户端
我的套接字来自CAsyncSocket的一个非常简单的类驱动器,我的环境是Windows MFC。
m_server.Create(....); // with the correct values
if (m_server.Listen()==FALSE)
以及稍后的OnSocketAccept()函数
if (m_server.Accept(tempSock))
{
CSocketThread* pThread = (CSocketThread*)AfxBeginThread(RUNTIME_CLASS(CSocketThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
...
我的模拟应用程序包含以下代码:
for (int i = 0; i < numOfClients; i++)
{
m_sConnected[i].Create();
int rVal = m_sConnected[i].Connect(csIPAddress.GetString(), m_port);
这不起作用。
在WireShark中,我可以看到我的(例如,numOfClients = 10个)10个客户端与不同的客户端源端口连接。
但 m_sConnected [i] 的每个新套接字在第二次连接到所有套接字后都变为NULL,包括 m_sConnected [0] 。
关闭套接字或销毁模拟应用程序在服务器端创建套接字关闭所有侦听套接字的开放线程。
有什么问题? 我可以为所有套接字客户端使用相同的进程/线程吗?
10倍
UrAv。
答案 0 :(得分:1)
你的问题是你没有以正确的方式使用CSocketThread对象 作为微软文档中的心理 在接受函数之后,您需要执行以下操作:
CSockThread* pSockThread = (CSockThread*)AfxBeginThread( RUNTIME_CLASS(CSockThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if (NULL != pSockThread) {
// Detach the newly accepted socket and save
//the SOCKET handle in our new thread object.
//After detaching it, it should no longer be
//used in the context of this thread.
pSockThread->m_hConnected = sConnected.Detach();
pSockThread->ResumeThread();
} }
当您将套接字连接到线程时,它将运行。
链接到microsoft doc: https://msdn.microsoft.com/en-us/library/wxzt95kb.aspx
答案 1 :(得分:0)
您的解决方案对我有用。我已经使用多个线程来强调在linux下的c ++中测试服务器。粘贴我的代码,对某人有帮助......如果他们在我的代码处理中发现任何缺陷,专家可以改进我的代码。我知道,我做错了,但没有其他人去测试服务器,因为到目前为止还没有人提供解决方案。我能够使用此代码测试服务器的100000个客户端。 - 克兰蒂。
void *connection_handler(void *);
#define PORT 9998
#define SERVER_IP "127.0.0.1"
#define MAXSZ 100
#define MAXSOCK 70000
int main()
{
int sockfd[MAXSOCK];//to create socket
int socket_desc , new_socket[MAXSOCK], *new_sock;
struct sockaddr_in serverAddress;//client will connect on this
int n;
char msg1[MAXSZ];
char msg2[MAXSZ];
int NoOfClients = MAXSOCK;
memset(msg2,0,100);
void *ret;
for(int i=0;i<NoOfClients;i++){
//create socket
sockfd[i]=socket(AF_INET,SOCK_STREAM,0);
//initialize the socket addresses
memset(&serverAddress,0,sizeof(serverAddress));
serverAddress.sin_family=AF_INET;
serverAddress.sin_addr.s_addr=inet_addr(SERVER_IP);
serverAddress.sin_port=htons(PORT);
//client connect to server on port
new_socket[i] = connect(sockfd[i],(struct sockaddr *)&serverAddress,sizeof(serverAddress));
printf("new socket connected= %d",new_socket[i]);
pthread_t sniffer_thread[MAXSOCK];
new_sock = malloc(sizeof(int));
*new_sock = new_socket[i];
int p=-1;
if( p = pthread_create( &sniffer_thread[i] , NULL , connection_handler , (void*) new_sock) < 0)
{
perror("could not create thread");
return 1;
}
}
return 0;
}
/*
* This will handle connection for each client
* */
void *connection_handler(void *socket_desc)
{
//Get the socket descriptor
int sock = *(int*)socket_desc;
int read_size;
char *message , client_message[50];
printf("we are in connection handler");
//Send some messages to the server
message = "Greetings! I am your connection handler\n";
int wlen = write(sock , message , strlen(message));
printf("write length is %d", wlen);
//Free the socket pointer
//close(sock);
free(sock);
return 0;
}