首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CreateThread循环

CreateThread循环
EN

Stack Overflow用户
提问于 2013-02-22 21:05:41
回答 2查看 718关注 0票数 0

我正在尝试用C++编写异步服务器侦听器,.I可以编写简单的侦听器而不使用异步,但现在我用CreateThread遇到了问题。

例如,如果客户端已经连接,控制台给我关于这个的结果+嗅探器可以修复它,10秒后客户端必须再次发送相同的数据包与不同的数据。我的控制台没有给我关于该数据包的结果,但嗅探器可以看到该数据包……如果有人能看到我的问题,请给我解释一下。

代码语言:javascript
复制
#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);

}
EN

回答 2

Stack Overflow用户

发布于 2013-02-23 05:15:14

争用条件很可能是问题的原因。在堆栈上声明csock,然后将其传递给SocketHandler。问题是,由于csock = SocketHandler ()是在循环中进行的,所以很可能在csock获得它并进行复制之前,csock的值会发生变化。解决方案是使用malloc动态分配csock,然后让SocketHandler释放它。

即使这不是您的特定问题的原因,在您修复它之前,此代码也永远不会是可靠的。

票数 0
EN

Stack Overflow用户

发布于 2017-10-08 01:30:16

CreateThread不会循环或做任何事情。你需要把代码放在一个循环中。如下所示:

代码语言:javascript
复制
DWORD WINAPI SocketHandler(void* lp) {
  for(;;) {
    /* Code here */
  }
  return EXIT_SUCCESS;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15024948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档