[clug] sockets compiling advice
Duncan Roe
duncan_roe at acslink.net.au
Sun Jan 18 00:19:22 GMT 2004
Try adding "-lstdc++" to your gcc line
On Sun, Jan 18, 2004 at 10:52:04AM +1100, Adrian Blake wrote:
> I have cut & pasted some code from a book but have trouble compiling.
> The following are the messages:
>
> gcc p10.6.cxx -o p10.6 -Wall -g
> In file included from p10.6.cxx:4:
> local_sock.h:6:1: warning: "_GNU_SOURCE" redefined
> p10.6.cxx:1:1: warning: this is the location of the previous definition
> /tmp/ccbmWDOI.o: In function `__static_initialization_and_destruction_0':
> /usr/include/c++/3.2/iostream:62: undefined reference to
> `std::ios_base::Init::Init[in-charge]()'
> /tmp/ccbmWDOI.o: In function `__tcf_0':
> /usr/include/c++/3.2/iostream:62: undefined reference to
> `std::ios_base::Init::~Init [in-charge]()'
> /tmp/ccbmWDOI.o: In function `main':
> /home/adrian/ipc/chapt_10/p10.6.cxx:15: undefined reference to
> `__gxx_personality_v0'
> collect2: ld returned 1 exit status
>
> The two source files are attached. Please advise me on what is required
> to compile this correctly
>
> Adrian
> --
> /*
> Local include file for socket programs
> */
> #ifndef LOCAL_SOCK_H
> #define LOCAL_SOCK_H
> #define _GNU_SOURCE
> #include <iostream>
> #include <sys/ioctl.h>
> #include <cstdio>
> #include <string.h>
> #include <ctype.h>
> #include <unistd.h>
> #include <stdlib.h>
> #include <signal.h>
> #include <wait.h>
> #include <sys/types.h>
> #include <sys/socket.h>
> #include <sys/un.h>
> #include <netdb.h>
> const int PORT=2002; // Arbitrary port programmer chooses
> static char buf[BUFSIZ]; // Buffer for messages
> const char *SERVER_FILE="server_socket";
> #endif
> using namespace std;
> /*
> Internet domain, connection-oriented SERVER
> */
> #include "local_sock.h"
> void signal_catcher(int);
> int
> main( ) {
> int orig_sock, // Original socket in server
> new_sock; // New socket from connect
> socklen_t clnt_len; // Length of client address
> struct sockaddr_in // Internet addr client & server
> clnt_adr, serv_adr;
> int len, i; // Misc counters, etc.
> // Catch when child terminates
> if (signal(SIGCHLD , signal_catcher) == SIG_ERR) {
> perror("SIGCHLD");
> return 1;
> }
> if ((orig_sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
> perror("generate error");
> return 2;
> }
> memset( &serv_adr, 0, sizeof(serv_adr) ); // Clear structure
> serv_adr.sin_family = AF_INET; // Set address type
> serv_adr.sin_addr.s_addr = htonl(INADDR_ANY); // Any interface
> serv_adr.sin_port = htons(PORT); // Use our fake port
> // BIND
> if (bind( orig_sock, (struct sockaddr *) &serv_adr,
> sizeof(serv_adr)) < 0){
> perror("bind error");
> close(orig_sock);
> return 3;
> }
> if (listen(orig_sock, 5) < 0 ) { // LISTEN
> perror("listen error");
> close (orig_sock);
> return 4;
> }
> do {
> clnt_len = sizeof(clnt_adr); // ACCEPT a connect
> if ((new_sock = accept( orig_sock, (struct sockaddr *) &clnt_adr,
> &clnt_len)) < 0) {
> perror("accept error");
> close(orig_sock);
> return 5;
> }
> if ( fork( ) == 0 ) { // Generate a CHILD
> while ( (len=read(new_sock, buf, BUFSIZ)) > 0 ){
> for (i=0; i < len; ++i) // Change the case
> buf[i] = toupper(buf[i]);
> write(new_sock, buf, len); // Write back to socket
> if ( buf[0] == '.' ) break; // Are we done yet?
> }
> close(new_sock); // In CHILD process
> return 0;
> } else
> close(new_sock); // In PARENT process
> } while( true ); // FOREVER
> return 0;
> }
> void
> signal_catcher(int the_sig){
> signal(the_sig, signal_catcher); // reset
> wait(0); // keep the zombies at bay
> }
More information about the linux
mailing list