2013-07-07 32 views
0

我使用多线程,但实际上线程没有调用...任何机构可以帮助我implented基本UDP客户端服务器应用程序..Udp_client_server_using多线程

class uu_FrameWorkSocket 
{ 

protected: 
struct sockaddr_in ModuleMySocketAddress; 
uu_int32 ModuleHostPortK; 
uu_char* ModuleHostNameK; 
uu_int32 ModuleSockFlagK; 
uu_int32* ModuleSockOptValueP; 

public: 
uu_void uu_ModuleInitSocket(uu_int32,uu_int32); 
uu_void uu_ModuleSetSocketOptions(uu_int32); 
uu_void SetHostName(uu_char*); 
uu_void SetPortNumber(uu_int32); 
uu_void uu_ModuleCloseSocket(uu_int32); 
uu_FrameWorkSocket(){ 

     ModuleHostPortK = 3232; 
     ModuleHostNameK = (uu_char*) malloc(20); 
     strcpy(ModuleHostNameK,"127.0.0.1"); 
    } 
}; 

uu_void uu_FrameWorkSocket :: SetHostName(uu_char *psHostName){ 
ModuleHostNameK = (uu_char*) malloc(20); 
strcpy(ModuleHostNameK,psHostName); 
} 

uu_void uu_FrameWorkSocket :: SetPortNumber(uu_int32 iPortNumber){ 
ModuleHostPortK=iPortNumber; 
} 

uu_void uu_FrameWorkSocket :: uu_ModuleCloseSocket(uu_int32 iSocketfd){ 
close(iSocketfd); 
} 

uu_void uu_FrameWorkSocket :: uu_ModuleInitSocket(uu_int32 iTypeFamily,uu_int32 iTypeProtocol){ 
if(iTypeFamily == UU_PROJECT_MODULE_IPV4) 
{ 
if(iTypeProtocol == UU_PROJECT_MODULE_TCP) 
ModuleSockFlagK = socket(AF_INET, SOCK_STREAM, 0); 
else 
ModuleSockFlagK = socket(AF_INET, SOCK_DGRAM, 0); 
} 
else 
{ 
if(iTypeProtocol == UU_PROJECT_MODULE_TCP) 
ModuleSockFlagK = socket(AF_INET6, SOCK_STREAM, 0); 
else 
ModuleSockFlagK = socket(AF_INET6, SOCK_DGRAM, 0); 
} 
if (ModuleSockFlagK == -1){ 
      printf("Error while initializing socket.\n"); 
      exit(0); 
     } 
} 

uu_void uu_FrameWorkSocket :: uu_ModuleSetSocketOptions(uu_int32 iTypeFamily){ 
ModuleSockOptValueP = (uu_int32*)malloc(sizeof(uu_int32)); 
     *ModuleSockOptValueP = 1; 

     if((setsockopt(ModuleSockFlagK, SOL_SOCKET, SO_REUSEADDR, (uu_char*)ModuleSockOptValueP, sizeof(uu_int32)) == -1)){ 
      printf("Error while setting socket options.\n"); 
      free(ModuleSockOptValueP); 
      exit(0); 
     } 
     free(ModuleSockOptValueP); 
     if(iTypeFamily == UU_PROJECT_MODULE_IPV4) 
     ModuleMySocketAddress.sin_family = AF_INET ; 
     else 
     ModuleMySocketAddress.sin_family = AF_INET6 ;   
     ModuleMySocketAddress.sin_port = htons(ModuleHostPortK); 
     memset(&(ModuleMySocketAddress.sin_zero), 0, 8);    
     ModuleMySocketAddress.sin_addr.s_addr = inet_addr(ModuleHostNameK); 

} 


class uu_ProjectModuleUdp : public uu_FrameWorkSocket 
{ 
protected: 
    socklen_t ModuleMySockAddrLength; 
    uu_int32* ModuleSockConnFlag; 
    sockaddr_in ModuleIpSockAddr; 
    pthread_t ModuleThreadId; 

public: 

struct Request{ 
sockaddr_in ModuleClientSockAddr; 
uu_int32 ModuleClientSocket; 
}; 

uu_void ModuleUdpBind(){ 
     if(bind(ModuleSockFlagK, (sockaddr*)&ModuleMySocketAddress, sizeof(ModuleMySocketAddress)) == -1){ 
      fprintf(stderr,"Error while binding to socket:%d\n",errno); 
      exit(0); 
     } 
    } 


uu_void ModuleUdpAccept(){ 
     ModuleMySockAddrLength = sizeof(sockaddr_in); 
     uu_char Msg[100]; 
     uu_int32 N; 
    struct Request ModuleRequestStructure; 
     while(true){ 
       if((N= recvfrom(ModuleSockFlagK,Msg,100,0, (sockaddr*)&ModuleIpSockAddr, &ModuleMySockAddrLength))!= -1){ 
       printf("==\nReceived connection from %s\n",inet_ntoa(ModuleIpSockAddr.sin_addr)); 
       printf("Received message: %s \n",Msg); 
       sendto(ModuleSockFlagK,Msg,N,0, (sockaddr*)&ModuleIpSockAddr, ModuleMySockAddrLength); 
       ModuleRequestStructure.ModuleClientSockAddr=ModuleIpSockAddr; 
       ModuleRequestStructure.ModuleClientSocket=ModuleSockFlagK; 
       pthread_create(&ModuleThreadId,0,&ModuleUdpSocketHandler, (uu_void*)&ModuleRequestStructure); 
       pthread_detach(ModuleThreadId); 
      } 
      else{ 
       fprintf(stderr, "Error accepting... %d\n", errno); 
      } 
     } 
    } 

static uu_void* ModuleUdpSocketHandler(uu_void* ModuleRequestStruct){ 

     Request *ModuleRequest=(Request *)ModuleRequestStruct; 
     uu_int32 iClientSocket=ModuleRequest->ModuleClientSocket; 
     sockaddr_in ClientSockaddr=ModuleRequest->ModuleClientSockAddr; 
    socklen_t ModuleMySockAddrLength = sizeof(sockaddr_in); 
     uu_char acBuffer[1024]; 
     uu_int32 iBufferLen = 1024; 
     uu_int32 iByteCount; 

     while(true){ 
      memset(acBuffer, '\0', iBufferLen); 
      if((iByteCount = recvfrom(iClientSocket,acBuffer,iBufferLen,0,(sockaddr*)&ClientSockaddr,&ModuleMySockAddrLength))== -1){ 
       fprintf(stderr, "Error receiving data %d\n", errno); 
       exit(0); 
      } 
      printf("Received bytes: %d\nReceived string: %s \n", iByteCount, acBuffer); 

      if((iByteCount = sendto(iClientSocket, acBuffer, strlen(acBuffer), 0,(sockaddr*)&ClientSockaddr,ModuleMySockAddrLength))== -1){ 
       fprintf(stderr, "Error sending data %d\n", errno); 
       exit(0); 
      } 

      printf("Sent bytes %d\n", iByteCount); 
     } 
    } 


uu_void ModuleUdpAfterConn(){ 
     uu_char acBuffer[1024]; 
     uu_int32 iByteCount; 
     uu_int32 iBufferLen=0; 
     ModuleMySockAddrLength = sizeof(sockaddr_in); 
     iBufferLen = 1024; 

     while(true){ 
      memset(acBuffer, '\0', iBufferLen); 

      printf("Enter some text to send to the server (press enter):\n"); 
      fgets(acBuffer, 1024, stdin); 
      acBuffer[strlen(acBuffer)-1]='\0'; 

      if((iByteCount=sendto(ModuleSockFlagK, acBuffer, strlen(acBuffer),0,(sockaddr*)&ModuleMySocketAddress,ModuleMySockAddrLength))== -1){ 
       fprintf(stderr, "Error sending data %d\n", errno); 
       exit(0); 
      } 
      printf("Sent bytes %d\n", iByteCount); 

      if((iByteCount = recvfrom(ModuleSockFlagK, acBuffer, iBufferLen, 0,NULL,NULL))== -1){ 
       fprintf(stderr, "Error receiving data %d\n", errno); 
       exit(0); 
      } 
      printf("Recieved bytes: %d\nReceived string: \"%s\"\n", iByteCount, acBuffer); 
     } 
     close(ModuleSockFlagK); 
    } 

}; 

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

if(strcmp(argv[1],"udp")==0){ 
if(strcmp(argv[2],"server")==0){ 
    printf("This is UDP Server"); 
    uu_ProjectModuleUdp server; 
    server.SetPortNumber(6745); 
    server.uu_ModuleInitSocket(UU_PROJECT_MODULE_IPV4,UU_PROJECT_MODULE_UDP); 
    server.uu_ModuleSetSocketOptions(UU_PROJECT_MODULE_IPV4); 
    server.ModuleUdpBind(); 
    server.ModuleUdpAccept(); 
} 
else if(strcmp(argv[2],"client")==0){ 
    printf("This is UDP Client"); 
    uu_ProjectModuleUdp client; 
    client.SetPortNumber(6745); 
    client.uu_ModuleInitSocket(UU_PROJECT_MODULE_IPV4,UU_PROJECT_MODULE_UDP); 
    client.uu_ModuleSetSocketOptions(UU_PROJECT_MODULE_IPV4); 
    client.ModuleUdpAfterConn(); 
} 
} 
else 
    printf("Wrong/Missing Arguments\n"); 
return 0; 
} 

这里为每一个客户一个线程必须是被调用但它不会调用..

+0

你为什么要为'ModuleSockOptValueP'分配一个'uu_int32'?为什么不简单地将其声明为'uu_int32 ModuleSockOptValueP;'?使用address-of运算符来获取指向它的指针:'&ModuleSockOptValueP'。 –

回答

0

可能发生的事情是您的线程崩溃。原因将是未定义的行为当您尝试访问ModuleRequest指针时,因为它指向ModuleUdpAccept内的局部变量。

ModuleUdpAccept返回时,该指针不再指向有效的内存,并且您得到未定义的行为,这可能会(或可能不会)导致线程崩溃。

+0

我改变了它,并看到,即使该线程被调用的第一条消息...从同一客户端发送第二条消息,而不是使用调用的线程它产生了另一个新的线程..我认为这可能是由于两个'recvfrom'在主进程中调用一个,在线程中调用另一个...如何解决这个问题 –