c++ - Passing Socket to Thread C -


i'm trying make network system using udp. i've managed working, want put listening part in separate thread can continue program without having wait messages (it's going used game).

the problem when pass socket new thread , use listening doesn't work , receives random input constantly. when use exact same code in method initialize socket, works fine.

this works:

bool serverudp() { wsadata w; socket sd;  struct sockaddr_in server, client; char buffer[default_buflen]; int bytes_received; int client_length;  /* open windows connection */ if (wsastartup(makeword(2,2)/*0x0101*/, &w) != 0) {     fprintf(stderr, "could not open windows connection.\n");     return false; }  /* open datagram socket */ sd = socket(af_inet, sock_dgram, 0); if (sd == invalid_socket) {     fprintf(stderr, "could not create socket.\n");     wsacleanup();     return false; }  /* clear out server struct */ memset((void *)&server, '\0', sizeof(struct sockaddr_in));  /* set family , port */ server.sin_family = af_inet; server.sin_port = htons(atoi(default_port));  server.sin_addr.s_un.s_un_b.s_b1 = 127; server.sin_addr.s_un.s_un_b.s_b2 = 0; server.sin_addr.s_un.s_un_b.s_b3 = 0; server.sin_addr.s_un.s_un_b.s_b4 = 1;  /* bind address socket */ if (bind(sd, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) == -1) {     fprintf(stderr, "could not bind name socket.\n");     closesocket(sd);     wsacleanup();     return false; }  client_length = (int)sizeof(struct sockaddr_in);  /* receive bytes client */ while (true) {     bytes_received = recvfrom(sd, buffer, default_buflen, 0, (struct sockaddr *)&client, &client_length);     fprintf(stderr,"received: %s\n", buffer); }  closesocket(sd); wsacleanup();     return true; } 

this doesn't:

bool serverudp() { wsadata w; socket sd;  struct sockaddr_in server, client; char buffer[default_buflen]; int bytes_received; int client_length;  /* open windows connection */ if (wsastartup(makeword(2,2)/*0x0101*/, &w) != 0) {     fprintf(stderr, "could not open windows connection.\n");     return false; }  /* open datagram socket */ sd = socket(af_inet, sock_dgram, 0); if (sd == invalid_socket) {     fprintf(stderr, "could not create socket.\n");     wsacleanup();     return false; }  /* clear out server struct */ memset((void *)&server, '\0', sizeof(struct sockaddr_in));  /* set family , port */ server.sin_family = af_inet; server.sin_port = htons(atoi(default_port));  server.sin_addr.s_un.s_un_b.s_b1 = 127; server.sin_addr.s_un.s_un_b.s_b2 = 0; server.sin_addr.s_un.s_un_b.s_b3 = 0; server.sin_addr.s_un.s_un_b.s_b4 = 1;  /* bind address socket */ if (bind(sd, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) == -1) {     fprintf(stderr, "could not bind name socket.\n");     closesocket(sd);     wsacleanup();     return false; }  _beginthread((void(*)(void*))receivethread,0,(void *)sd);  closesocket(sd); wsacleanup();     return true; }  void receivethread(socket sd) { struct sockaddr_in client, server; char buffer[default_buflen];  int bytes_received; int client_length;  client_length = (int)sizeof(struct sockaddr_in);  while (true) {     bytes_received = recvfrom(sd, buffer, default_buflen, 0, (struct sockaddr *)&client, &client_length);     fprintf(stderr,"received: %s\n", buffer); } } 

the second piece of code spams random input, though it's receiving weird message. the, first piece of code waits message , continues when gets 1 (i've got client part too).

thanks help!

cheers,

maxim schoemaker

the main thread closes socket after starting other thread. therefore thread no longer has valid socket handle.


Comments

Popular posts from this blog

c# - SVN Error : "svnadmin: E205000: Too many arguments" -

c# - Copy ObservableCollection to another ObservableCollection -

All overlapping substrings matching a java regex -