Attention: S'il vous plaît traitez-moi comme la recrue que je suis. C'est mon premier "vrai" programme C. Donc, si je ne comprends pas certaines choses, c'est pourquoi. J'essaye de faire un serveur de causerie en suivant l'exemple du guide de programmation de réseau de Beej. Il est venu recommandé, alors voilà.Comment gérer ce pointeur dans getaddrinfo?
Je souhaite qu'une fonction accepte un pointeur sur une structure, modifie les propriétés de ce pointeur et configure un écouteur sur le port transmis. Dans le code ci-dessous, je reçois une erreur de segmentation, et honnêtement, je n'arrive pas à comprendre pourquoi. Blame moi d'être vert. (En développement dans Netbeans 6.8 sur Ubuntu, si nécessaire):
#define PORT "4400"
typedef struct {
int port;
fd_set *connections;
int connections_count;
int listener;
struct addrinfo address;
struct addrinfo socket_hints;
} Server;
typedef struct {
struct sockaddr_storage address; // User's address
int fs_id; // ID to the socket they belong to
char *name; // Pointer to the user's name
struct User *nextUser; // Next user in the list
} User;
void initialize_server(Server *passed_server, char *port) {
struct addrinfo *temp;
int result;
// Set up the server hints
memset(&passed_server->socket_hints, 0, sizeof(struct addrinfo));
passed_server->socket_hints.ai_family = AF_UNSPEC;
passed_server->socket_hints.ai_socktype = SOCK_STREAM;
passed_server->socket_hints.ai_flags = AI_PASSIVE;
result = getaddrinfo(NULL, port, &passed_server->socket_hints, &temp);
printf("Result: %d\n", result);
}
int main(int argc, char** argv) {
// Set up socket stuff
Server *server; // Set up the server
memset(server, 0, sizeof(Server));
fd_set read_sockets; // Master socket holder and sockets to read
int new_connection; // Holds the socket ID of the new connection
socklen_t address_length; // Used to hold the length of the address from the user
struct addrinfo;
// Useful sets
char buffer[1024];
int bytes_recieved;
int yes = 1; // For SETOPT
// Set up server info on defined port
initialize_server(server, PORT);
FD_ZERO(&read_sockets);
return (EXIT_SUCCESS);
}
Si vous avez besoin du code complet (je pense que je posté tout l'essentiel), vous pouvez trouver un lien ci-dessous. Merci d'avance pour toute aide ou tentative!
+1, pour un excellent premier article. Bienvenue à StackOverflow. La seule chose que je peux penser à cela pourrait améliorer ceci: Si vous exécutez ce code via un débogueur, disons gdb, avec des informations de débogage, il devrait vous dire sur quelle ligne ce code est segfaulting, ce qui peut être un bon point de départ. débogage. – Thanatos
Merci. Je vais jeter un coup d'oeil dans cela. – Codeacula
Juste quelques conseils. Vous pourriez vouloir essayer de développer sur emacs 23. Aussi quand vous obtenez un souche de pile, qui sont normalement provoqués en adressant la mémoire non valide. Essayez d'utiliser gdb et backtrace (bt). Cela vous mènera à la ligne qui a échoué. Et aussi installer valgrind son très bon pour tracer les erreurs de mémoire. c'est-à-dire valgrind --leak-check = yes ./your_app. J'espère que cela pourra aider. – ant2009