gpt4 book ai didi

C++ CreateThread 不显示结果

转载 作者:行者123 更新时间:2023-11-28 07:45:20 25 4
gpt4 key购买 nike

我正在尝试使用 C++ 创建异步服务器监听器我是 C++ 的新手,但我必须做这个项目,我是 Web 开发人员 (PHP),但 PHP 无法建立异步连接+他是一个非常糟糕的大型语言连接量...我可以编写没有异步的简单监听器,但现在我遇到“CreateThread”问题...例如,如果客户端已连接,控制台会给我关于此的结果 + 嗅探器可以修复它...客户端 10 秒后必须再次向我发送具有不同数据的相同数据包。我的控制台没有给我有关该数据包的结果,但嗅探器可以看到该数据包...如果有人能看到我的问题请解释我...(抱歉我的英语不好 :D)

#include <winsock2.h>
#include <windows.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>

DWORD WINAPI SocketHandler(void*);

int main(int argv, char** argc){

//The port you want the server to listen on
int host_port = 7878;

//Initialize socket support WINDOWS ONLY!
unsigned short wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 || ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )) {
fprintf(stderr, "Could not find useable sock dll %d\n",WSAGetLastError());

}

//Initialize sockets and set any options
int hsock;
int * p_int ;
hsock = socket(AF_INET, SOCK_STREAM, 0);
if(hsock == -1){
printf("Error initializing socket %d\n",WSAGetLastError());

}

p_int = (int*)malloc(sizeof(int));
*p_int = 1;
if( (setsockopt(hsock, SOL_SOCKET, SO_REUSEADDR, (char*)p_int, sizeof(int)) == -1 )||
(setsockopt(hsock, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int, sizeof(int)) == -1 ) ){
printf("Error setting options %d\n", WSAGetLastError());
free(p_int);

}

free(p_int);

//Bind and listen
struct sockaddr_in my_addr;

my_addr.sin_family = AF_INET ;
my_addr.sin_port = htons(host_port);

memset(&(my_addr.sin_zero), 0, 8);
my_addr.sin_addr.s_addr = INADDR_ANY ;

if( bind( hsock, (struct sockaddr*)&my_addr, sizeof(my_addr)) == -1 ){
fprintf(stderr,"Error binding to socket, make sure nothing else is listening on this port %d\n",WSAGetLastError());

}
if(listen( hsock, 10) == -1 ){
fprintf(stderr, "Error listening %d\n",WSAGetLastError());

}

//Now lets to the server stuff

int* csock;
sockaddr_in sadr;
int addr_size = sizeof(SOCKADDR);

while(true){
printf("waiting for a connection\n");
csock = (int*)malloc(sizeof(int));

if((*csock = accept( hsock, (SOCKADDR*)&sadr, &addr_size))!= INVALID_SOCKET ){
printf("Received connection from %s",inet_ntoa(sadr.sin_addr));
CreateThread(0,0,&SocketHandler, (void*)csock , 0,0);
}
else{
fprintf(stderr, "Error accepting %d\n",WSAGetLastError());
}
}


}

DWORD WINAPI SocketHandler(void* lp){

int *csock = (int*)lp;
char buffer[1024];
int buffer_len = 1024;
int bytecount;
memset(buffer, 0, buffer_len);
if((bytecount = recv(*csock, buffer, buffer_len, 0))==SOCKET_ERROR){
fprintf(stderr, "Error receiving data %d\n", WSAGetLastError());
}
printf("Received bytes %d\n Received string \"%s\"\n", bytecount, buffer);



char buff[1] = {0x11};
if((bytecount = send(*csock, buff, 1, 0))==SOCKET_ERROR){
fprintf(stderr, "Error sending data %d\n", WSAGetLastError());
}

printf("Sent bytes: %d. Send Message: %s\n ", bytecount,buff);


free(csock);

}

最佳答案

我怀疑问题不在于创建线程,而在于数据的传递。将套接字传递给线程可能更简单。此外,在函数结束时,您正确地释放了内存,但没有关闭套接字。我已经进行了更改并验证它可以正常运行。我所做的更改是带有//*

的注释
#include <winsock2.h>
#include <windows.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>

DWORD WINAPI SocketHandler(void*);

//*** Changed to work with my version of
//*** Visual Studio
int _tmain(int argc, _TCHAR* argv[]){

//The port you want the server to listen on
int host_port = 7878;

//Initialize socket support WINDOWS ONLY!
unsigned short wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 || ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )) {
fprintf(stderr, "Could not find useable sock dll %d\n",WSAGetLastError());
}

//Initialize sockets and set any options
//*** Changed to be SOCKET instead of int
SOCKET hsock;
int * p_int ;
hsock = socket(AF_INET, SOCK_STREAM, 0);
if(hsock == -1){
printf("Error initializing socket %d\n",WSAGetLastError());
}

p_int = (int*)malloc(sizeof(int));
*p_int = 1;
if( (setsockopt(hsock, SOL_SOCKET, SO_REUSEADDR, (char*)p_int, sizeof(int)) == -1 )||
(setsockopt(hsock, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int, sizeof(int)) == -1 ) ){
printf("Error setting options %d\n", WSAGetLastError());
free(p_int);
}

free(p_int);

//Bind and listen
struct sockaddr_in my_addr;

my_addr.sin_family = AF_INET ;
my_addr.sin_port = htons(host_port);

memset(&(my_addr.sin_zero), 0, 8);
my_addr.sin_addr.s_addr = INADDR_ANY ;

if( bind( hsock, (struct sockaddr*)&my_addr, sizeof(my_addr)) == -1 ){
fprintf(stderr,"Error binding to socket, make sure nothing else is listening on this port %d\n",WSAGetLastError());
}
if(listen( hsock, 10) == -1 ){
fprintf(stderr, "Error listening %d\n",WSAGetLastError());
}

//Now lets to the server stuff
//*** Changed to be SOCKET instead of int*
SOCKET csock;
sockaddr_in sadr;
int addr_size = sizeof(SOCKADDR);

while(true){
printf("waiting for a connection\n");
//*** Changed to comment out line as it is not needed
// csock = (SOCKET)malloc(sizeof(SOCKET));
//*** Changed check to be INVALID_SOCKET
if((csock = accept( hsock, (SOCKADDR*)&sadr, &addr_size))!= INVALID_SOCKET ){
printf("Received connection from %s",inet_ntoa(sadr.sin_addr));
//*** Changed to pass the client socket
CreateThread(0,0,&SocketHandler, (void*)csock , 0,0);
}
else{
fprintf(stderr, "Error accepting %d\n",WSAGetLastError());
}
}
}

DWORD WINAPI SocketHandler(void* lp){

//** Changed to cast as the SOCKET which was passed
SOCKET csock = (SOCKET)lp;
char buffer[1024];
int buffer_len = 1024;
int bytecount;
memset(buffer, 0, buffer_len);
if((bytecount = recv(csock, buffer, buffer_len, 0))==SOCKET_ERROR){
fprintf(stderr, "Error receiving data %d\n", WSAGetLastError());
}
printf("Received bytes: %d\nReceived string: \"%s\"\n", bytecount, buffer);

char buff[1] = {0x11};
if((bytecount = send(csock, buff, 1, 0))==SOCKET_ERROR){
fprintf(stderr, "Error sending data %d\n", WSAGetLastError());
}

printf("Sent bytes: %d. Send Message: %s\n ", bytecount,buff);

//*** Changed to close the socket after the message is sent. Otherwise
//*** the socket would remain open
closesocket(csock);

//*** Changed to comment the line out as there is
//*** no allocated memory.
//free(csock);

return 0;
}

关于C++ CreateThread 不显示结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15005609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com