Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

tjw09003

macrumors newbie
Original poster
Feb 11, 2010
13
0
This will compile in ubuntu but not osx, gcc output is at the bottom of the post. This code is a monster of copied and pasted code from tutorials, but it does compile in ubuntu :)

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

void sendMessagedd(char* test);

void sendMessagedd(char * test){
int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];
    /*if (argc < 3) {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }*/
    portno = atoi("60000");
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
        error("ERROR opening socket");
    server = gethostbyname("localhost");
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);
    
    if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR connecting");
        
    //printf("Please enter the message: ");
    bzero(buffer,256);
    //fgets(buffer,255,stdin);
    n = write(sockfd,test,strlen(test));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);/**/
    close(sockfd);
    

}

int main(void)
{
	sendMessagedd("Hello World");

	return 0;
}

gcc output

Code:
gcc client.c -o client
client.c: In function ‘sendMessagedd’:
client.c:37: warning: passing argument 2 of ‘connect’ from incompatible pointer type
Undefined symbols:
  "_error", referenced from:
      _sendMessagedd in cc2nPdDt.o
      _sendMessagedd in cc2nPdDt.o
      _sendMessagedd in cc2nPdDt.o
      _sendMessagedd in cc2nPdDt.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
 
It's not a compilation error. It's a linker error. The symbol _error cannot be found.

I am not sure where is that symbol on Mac OS X is. To overcome it you could add a line at the beginning of the file (preferably after #include directives):

#define error printf

That will use printf instead of error. This way an executable file will be produced though you need to keep in mind that printf will print error messages to the standard console while error would print to error console. It may matter if you are going to run it in background. I am not an expert here though.
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.