socket() blockiert

supervisor

supervisor

Eroberer
hallo!

ich hab jetzt mit netzwerkprogrammierung angefangen, und hab versucht n kleinen 'server' zu schreiben, der im Grunde nur auf verbindungen wartet und wenn eine kommt was auf der shell ausgibt. das Problem: es funktioniert irgendwie nich. ich hab jetzt seit ca. 3 stunden versucht, das problem zu beseitigen, konnte aber nur rausfinden, dass es am aufruf von socket() liegt. da bleibt es zwar hängen, der prozess bleibt aber weiter am leben.

wahrscheinlich hab ich eh blos nen dummen anfängerfehler gemacht, also hier is der code:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <signal.h>

int main()
{
	int db;
	
	int sockfd;
	struct sockaddr_in hostaddr;
	struct sockaddr_in clientaddr;
	socklen_t size;
	
	sockfd = socket(PF_INET, SOCK_STREAM, 0);
	
	printf("%d", sockfd);
	
	hostaddr.sin_family = AF_INET;
	hostaddr.sin_port = htons(5000);
	hostaddr.sin_addr.s_addr = INADDR_ANY;
	memset(hostaddr.sin_zero, '\0', sizeof hostaddr.sin_zero);
	
	db = bind(sockfd, (struct sockaddr *)&hostaddr, sizeof hostaddr);
	printf("%d", db);
	
	db = listen(sockfd, 10);
	printf("%d", db);
	
	while(1)
	{
		int new_fd = accept(sockfd, (struct sockaddr *)&clientaddr, &size);
		printf("Verbindung angenommen");
	}
}
 
Mit ein wenig Error-Handling lassen sich solche Probleme zumeist schneller beheben:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <signal.h>

int main()
{
  int db;

  int sockfd;
  struct sockaddr_in hostaddr;
  struct sockaddr_in clientaddr;
  socklen_t size;
  int new_fd;

  sockfd = socket(AF_INET, SOCK_STREAM, 0);

  if(sockfd < 0) {
    perror("socket");
    exit(1);
  }

  printf("%d\r\n", sockfd);

  hostaddr.sin_family = AF_INET;
  hostaddr.sin_port = htons(5000);
  hostaddr.sin_addr.s_addr = INADDR_ANY;

  if(bind(sockfd, (struct sockaddr *)&hostaddr, sizeof hostaddr) < 0) {
    perror("bind");
    exit(1);
  }

  if(listen(sockfd, 10) < 0) {
    perror("listen");
    exit(1);
  }


  while(1)
    {
      new_fd = accept(sockfd, (struct sockaddr *)&clientaddr, &size);
      if(new_fd < 0) {
        perror("accept");
        exit(1);
      }
      printf("Verbindung angenommen\r\n");
      close(new_fd);
    }
  close(sockfd);
}

Sonst helfen auch die Programme strace und ltrace weiter, um den Programmfluss nachzuvollziehen und zu sehen wo er stecken bleibt.
 

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

C HTTP request

Segmentation Fault bei strcat?

[C++] Socket Probleme mit Adresse...

freed liefert 0

Zurück
Oben