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
Post a Comment