C 创建多个套接字客户端

C++ Creating multiple socket clients

本文关键字:套接字 客户端 创建      更新时间:2023-10-16

我正在尝试为多个套接字客户端构建模拟。我的服务器具有以下代码来收听多个客户端

我的插座来自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]

关闭插座或破坏模拟应用程序在服务器端创建套接字的所有打开线程的插座。

有什么问题?我可以为所有插座客户端使用相同的过程/线程吗?

10x

URAV。

您的问题是您没有以正确的方式使用csocketthread对象。
作为Microsoft Documention的Mentiend接受功能后,您需要执行以下操作:

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

您的解决方案对我有用。我已经使用多个线程来强调Linux下C 的服务器。粘贴我的代码,这对某人会很有帮助...如果我的代码处理中有任何缺陷,专家可以改善我的代码。我知道,我做错了什么,但是没有其他人去测试服务器,因为没有人为此提供解决方案。我可以使用此代码为100000个客户端测试服务器。-Kranti。

包括//用于线程,与lpthread

链接
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 handlern";
    int wlen = write(sock , message , strlen(message));
    printf("write length is %d", wlen);
    //Free the socket pointer
    //close(sock);
    free(sock);
return 0;
}