Ostrzeżenie: Proszę traktować mnie jak żółtodzioba, którym jestem. To mój pierwszy "prawdziwy" program C. Więc jeśli nie rozumiem niektórych rzeczy, to dlatego.Jak obsłużyć ten wskaźnik w getaddrinfo?
Próbuję utworzyć serwer czatu zgodnie z przykładem z Przewodnika po programowaniu sieci w programie Beej. To było zalecane, więc proszę bardzo.
Chcę mieć funkcję akceptować wskaźnik do struktury, modyfikować właściwości w tym wskaźniku i skonfigurować odbiornik na przekazanym porcie. W poniższym kodzie otrzymuję błąd segmentacji i naprawdę nie mogę zrozumieć dlaczego. Obwinia mnie, że jestem zielony. (Rozwój w NetBeans 6.8 na Ubuntu, jeśli to konieczne):
#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);
}
Jeśli potrzebujesz pełnego kodu (myślę pisał wszystko zasadniczą), można znaleźć poniżej link. Z góry dziękuję za pomoc lub próbę!
+1 za doskonały pierwszy wpis. Witamy w StackOverflow. Jedyne, co mogę o tym myśleć, może to poprawić: Jeśli uruchomisz ten kod za pomocą debuggera, powiedz gdb, z informacją o debugowaniu, to powinieneś powiedzieć, w którym wierszu jest ten kod, który może być dobrym punktem wyjścia dla debugowanie. – Thanatos
Dziękuję. Zajrzę do tego. – Codeacula
Zaledwie kilka wskazówek. Możesz próbować rozwijać się na emacs 23. Również, gdy pojawi się kikut sterty, który zwykle jest spowodowany przez adresowanie nieprawidłowej pamięci. Spróbuj użyć gdb i śledzenia wstecznego (bt). Zaprowadzi cię do linii, która zawiodła. A także zainstaluj valgrind, który jest bardzo dobry do śledzenia błędów pamięci. np. valgrind --leak-check = yes ./your_app. Nadzieja, która pomaga. – ant2009