- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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/
当我尝试使用CreateThread函数时,我遇到了一个奇怪的错误。这是我的代码: HANDLE threads[3]; //threads[0] is printer, threads[1] is
CreateThread 返回一个HANDLE 对象,需要通过CloseHandle 关闭 文档指出,线程对象保留在系统中,直到线程终止并且通过调用 CloseHandle 关闭线程的所有句柄。 我的
我将 struct 传递给 CreateThread() 函数。另一台机器上的相同代码工作正常。但是在我的机器上,“SendItem”总是变成 0xccccccc Bad Ptr>。有谁知道为什么?
我目前正在从事一个项目,我们使用 pthreads 为 UNIX 系统实现 C 线程。现在我们也希望能够在 Windows 上运行整个项目,我正在翻译 WIN32 的所有线程。现在我遇到了一个问题,我
我在创建数千个线程并关闭它时遇到问题。看一下这段代码: HANDLE threadHandles[i]; for(int i = 0; i < 1000; i++) { CreateThrea
#include DWORD Menuthread(LPVOID in) { return 0; } int main() { CreateThread(NULL, NULL, Menuth
我正在尝试使用 C++ 创建异步服务器监听器我是 C++ 的新手,但我必须做这个项目,我是 Web 开发人员 (PHP),但 PHP 无法建立异步连接+他是一个非常糟糕的大型语言连接量...我可以编写
我正在创建一个线程,它可以控制所有程序过程消息并且不会卡住程序。我写了this code我得到了 program not responding。 有没有人有使用线程的经验可以帮助我? 最佳答案 Win
我正在使用 VC++ 2012 Express 创建一个多线程聊天客户端-服务器。代码改编自此处:http://www.codeproject.com/Articles/14032/Chat-Clie
我想在一个类中启动一个线程,该线程将调用一个函数,该函数是同一类的成员。以下是我要构建的示例代码。 void CM::ExecuteIt() { // Some Calculations if(/*C
这是我第一次与 windows 打交道。我尝试创建线程,但无法编译我的代码。 这是我的代码的一部分: WORD _tid; HANDLE readerThread= CreateThread(0,0
如何给CreateThread回调函数传递int参数?我试了一下: DWORD WINAPI mHandler(LPVOID sId) { ... arr[(int)sId] ... } int id
当我使用CreateThread API方法时,我需要做什么在传递 LPVOID lpParameter 的地方传递多个参数? 最佳答案 您可以创建一个包含所有相关数据的结构,并将指向该结构实例的指针
问题: 如何传递具体两个参数给CreateThread , 何时: 参数一,类型为SOCKET 参数二,一个接口(interface)指针: _COM_SMARTPTR_TYPEDEF(Range,
我只是想知道究竟是什么因素影响了 createthread 的执行速度,以及它必须存活多长时间才能使其“值得”。 背景:我应该在游戏循环中的什么地方生成线程? 最佳答案 主游戏循环不是产生工作线程的地
我正在尝试创建 4 个线程以在我的 4 个 CPU 内核上同时运行一个函数。我调用的函数将根据 val 变量值更改一些循环偏移量。 我试过了,但是它没有正确地增加 val 计数器,一些线程报告相同的值
CreateThread Windows API 函数的保留参数和提交参数有什么区别? 我无法理解以下几行.. The reserve argument sets the amount of addr
我们知道在Windows下创建一个线程的方法有两种,一种就是调用Windows API CreateThread()来创建线程;另外一种就是调用MSVC CRT的函数_beginthread()或_
我在调用 CreateThread 时将类引用作为参数传递给 ThreadProc 时遇到问题。这是一个示例程序,演示了我遇到的问题: program test; {$APPTYPE CONSOLE}
#include #include #include #include #include #include void Thread1( LPVOID param) {
我是一名优秀的程序员,十分优秀!