c - TCP Server Crash -


i wondering why crashes when client connects?? supposed simple tcp server when client connects , sends string, server responds number of a's in string. server crashes client types letter in.

#include<io.h> #include<stdio.h> #include<winsock2.h>  #pragma comment(lib,"ws2_32.lib") //winsock library  int main(int argc , char *argv[]) { wsadata wsa; socket s , new_socket, master; struct sockaddr_in server , address; int c, valread; char *message = "welcome marshall's tcp server!!"; int maxrecv = 1024; char *buffer; char ammta = 'a'; char ammtb = 'a'; int count = 0, x; fd_set readfds; buffer =  (char*) malloc((maxrecv + 1) * sizeof(char));  printf("\ninitialising winsock..."); if (wsastartup(makeword(2,2),&wsa) != 0) {     printf("failed. error code : %d",wsagetlasterror());     return 1; }  printf("initialised.\n");  //create socket if((s = socket(af_inet , sock_stream , 0 )) == invalid_socket) {     printf("could not create socket : %d" , wsagetlasterror()); }  printf("socket created.\n");  //prepare sockaddr_in structure server.sin_family = af_inet; server.sin_addr.s_addr = inaddr_any; server.sin_port = htons( 9000 );  //bind if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == socket_error) {     printf("bind failed error code : %d" , wsagetlasterror());     exit(exit_failure); }  puts("bind done");  //listen incoming connections listen(s , 3); //accept , incoming connection puts("waiting incoming connections...");  c = sizeof(struct sockaddr_in);  while( (new_socket = accept(s , (struct sockaddr *)&address, &c)) != invalid_socket ) {     puts("connection accepted");  send(new_socket , message , strlen(message) , 0);     valread = recv( new_socket , buffer, maxrecv, 0);              if( valread == socket_error)             {                 int error_code = wsagetlasterror();                 if(error_code == wsaeconnreset)                 {                     //somebody disconnected , details , print                     printf("host disconnected unexpectedly , ip %s , port %d \n" , inet_ntoa(address.sin_addr) , ntohs(address.sin_port));                      //close socket , mark 0 in list reuse                     closesocket( s );                 }                 else                 {                     printf("recv failed error code : %d" , error_code);                 }             }             if ( valread == 0)             {                 //somebody disconnected , details , print                 printf("host disconnected , ip %s , port %d \n" , inet_ntoa(address.sin_addr) , ntohs(address.sin_port));                  //close socket , mark 0 in list reuse                 closesocket( s );             }              else             {        (x = 0; buffer[x] != '\0'; x++) {                 if (buffer[x] == ammta || buffer[x] == ammtb)                 count++;     }          char feedback[150];         sprintf(feedback, "there %d a's in string", count);                 feedback[maxrecv] = '\0';                 printf("%s:%d - %s \n" , inet_ntoa(address.sin_addr) , ntohs(address.sin_port), buffer);                 send( s , feedback , maxrecv , 0 );             } free(buffer); }  if (new_socket == invalid_socket) {     printf("accept failed error code : %d" , wsagetlasterror());     return 1; }  closesocket(s); wsacleanup();  return 0; 

}

10057 - wsaenotconn - socket not connected.

the send call correct , uses new_socket. recv call uses socket/sd "s". recv call should use new_socket.

the error 10057 returned because s bound local end point , not connected remote end whereas new socket returned accept connected remote end.


Comments

Popular posts from this blog

c# - How Configure Devart dotConnect for SQLite Code First? -

java - Copying object fields -

c++ - Clear the memory after returning a vector in a function -