Sockets (Windows) - accept()

desperate00

Grünschnabel
Hallo!

Ich schreibe gerade ein kleines Server-/Client-Porgramm um die dynamische IP
von einem Laptop auf den Arbeitsplatzrechner zu übertragen.Beim complieren beider Programme erhalte ich keine Fehlermeldung. Leider klappt die ausführung nicht.

Auf der Serverseite bekomme ich nach dem accept() beim versenden mit send() folgenden Fehlercode 10038 - The descriptor is not a socket.

Auf der Clientseite bekomme ich beim Empfangen der Nachricht mit recv() den Fehlercode 10054 - Connection reset by peer.

Was mir beim debuggen aufgefallen ist das der Rückgabewert bei accept() 0 ist und soweit ich mich ans Studium erinnern kann muss der Rückgabewert > 0 sein.

Hat irgendwer vielleicht eine Idee warum das bei mir nicht funktioniert? Bin gerade ziemlich am Ende mit meinem Latein und bräuchte das für eine Projektarbeit.

Falls notwendig kann ich meinen Quellcode posten, wollte aber nicht gleich mit der Tür ins Haus fallen.

Danke schonmal für evt. Antworten! :)
 
Hallo,

klappen denn die Funktionsaufrufe von "bind()" und "listen()" (müssen ebenfalls != 0 sein)?
Ich denke, ohne ein paar Codeschnipselchen von dir werden wir hier nicht weiterkommen.

Gruß
MCoder
 
Ja, alle vorherigen wie socket(), connect(), bind(), accept() usw funtionieren.
Ich bekomme auch die IP vom Laptop angezeigt. Nur möchte ich danach noch ein paar Messages versenden/empfangen.

Poste nun mal den wichtigstens Teil meiner Programme...

Server:
Code:
int main(int argc, char *argv[])
{
  WSADATA wsaData;
  SOCKET server_socket;
  SOCKET client_socket;
  struct sockaddr_in server;
  struct sockaddr_in client;
  int client_size;
  char buffer[buffer_size];
  int bytes;
  
  /* init winsock: version 1.1 */
  if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
  {
    printf("WSAStartup() failed, %lu\n", WSAGetLastError());
    return EXIT_FAILURE;
  }
  
  /* clear sockaddr structure */
  memset((char*)&server, 0, sizeof(server));
  /* set properties */
  server.sin_addr.s_addr = INADDR_ANY;
  server.sin_port = htons(SERVER_PORT);
  server.sin_family = AF_INET;
  
  /* create socket – TCP/IP connection */
  /* AF_INET: IPv4, SOCK_STREAM: TCP, 0: standard protocol of socket type */
  server_socket = socket(AF_INET, SOCK_STREAM, 0);
  if (server_socket == INVALID_SOCKET) 
  {
    printf("socket() failed, %lu\n", WSAGetLastError());
    return EXIT_FAILURE;
  }
  else
    printf("socket() ok");
  
  /* bind a local address to socket*/
  if (bind(server_socket, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
  {
    printf("bind() failed, %lu\n", WSAGetLastError());
	return EXIT_FAILURE; 	 					 
  }
  else
    printf("bind() ok");
  
  /* listen for incoming connections */
  if (listen(server_socket, QUEUE_LEN) == SOCKET_ERROR)
  {
    printf("listen() failed, %lu\n", WSAGetLastError());
	return EXIT_FAILURE; 	 				 
  }
  else
    printf("listen() ok");
  
  printf("\nIP Server is ready. Waiting for incoming connection...");
  
  for (;;)
  {
    client_size = sizeof(client);
    if (client_socket = accept(server_socket, (struct sockaddr*)&client, &client_size) == INVALID_SOCKET)
    {
      printf("accept() failed, %lu\n", WSAGetLastError());
	  return EXIT_FAILURE; 
	}
  else
    printf("accept() ok");  
    /* no more use for --> close */
    /* close(server_socket); */
    printf("\n\nFollowing client has logged on: %s", inet_ntoa(client.sin_addr));
    
    /* datatransfer between server & client*/    
    /*send welcome message*/
	memset(buffer, 0, buffer_size);
    sprintf(buffer, "You`re connected to IP-Server\n\0");	
	bytes = send(client_socket, buffer, strlen(buffer), 0);	
	if (bytes == SOCKET_ERROR)
    {
	  printf("\nError occured while sending message. %lu\n", WSAGetLastError());
	  return EXIT_FAILURE;
	}
		
  } /*end of for*/

  close(server_socket);
  
  /*analogue to WSAStartup*/
  /* WSACleanup(); */

  return 0;
}


Client:
Code:
int main(int argc, char *argv[])
{
  WSADATA wsaData;
  /*new: = INVALID_SOCKET*/
  SOCKET client_socket;
  struct sockaddr_in client;
  char buffer[buffer_size];
  int byte;
  
  /* init winsock: version 1.1 */
  if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
  {
    printf("WSAStartup() failed, %lu\n", WSAGetLastError());
    return 1;
  }
  
  /* clear sockaddr structure */
  memset((char*)&client, 0, sizeof(client));
 
  client.sin_addr.s_addr = inet_addr("158.92.161.94");
  /*client.sin_addr.s_addr = inet_addr("127.0.0.1");*/
  client.sin_port = htons(SERVER_PORT);
  client.sin_family = AF_INET;
  
  /* create socket – TCP connection */
  /* AF_INET: IPv4, SOCK_STREAM: TCP, 0: standard protocol of socket type */
  client_socket = socket(AF_INET, SOCK_STREAM, 0);
  if (client_socket == INVALID_SOCKET) 
  {
    printf("socket() failed, %lu\n", WSAGetLastError());
    WSACleanup();
	return 1;
  } 

  /* connect to server */
  if (connect(client_socket, (struct sockaddr*)&client, sizeof(client))== SOCKET_ERROR)
  {
    printf("\nconnect() failed, %lu\n", WSAGetLastError());
    return EXIT_FAILURE;
  }  
 
  /*blablablablablabl*/
  memset(buffer, 0, buffer_size);
  byte = recv(client_socket, buffer, sizeof(buffer), 0);
  if (byte == SOCKET_ERROR) 
  {  
	printf("Error occured while receiving message, %lu\n", WSAGetLastError());
	return EXIT_FAILURE;
  }
   
    
  /* free socket */
  /*closesocket(client_socket);*/
  
  /*analogue to WSAStartup*/
  /*WSACleanup();*/ 
  return 0;
}
 
Hallo,
du hast bei der Zuweisung im Ausdruck die Klammer vergessen:
C++:
if( (client_socket = accept(server_socket, (struct sockaddr*)&client, &client_size)) == INVALID_SOCKET )
Gruß
MCoder
 
Zurück