Hi,
I am new on UNIX and Socket programming and tried to run a sample code. when
I compiled server.c(below), it is OK, but when I linked it. I got
below error message:
% gcc -o server server.o
Undefined first referenced
symbol in file
socket server.o
accept server.o
bind server.o
getservbyname server.o
listen server.o
ld: fatal: Symbol referencing errors. No output written to server
collect2: ld returned 1 exit status
I compiled server.c on SunOS 5.6 and 5.7. How should I do to pass the
link(gcc -o...)?
Thank you every much!
Jingyan
/*********** server.c ****************
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
main(argc, argv)
int argc;
char *argv[];
{
struct servent *servp;
struct sockaddr_in server, remote;
int request_sock, new_sock;
int nfound, fd, maxfd, bytesread, addrlen;
fd_set rmask,mask;
static struct timeval timeout = {0,500000}; /* one half second */
char buf[BUFSIZ];
if (argc!=2) {
(void) fprintf(stderr, "usage: %s service\n", argv[0] );
exit(1);
}
if ((request_sock = socket(AF_INET, SOCK_STREAM, 0))<0) {
perror("socket");
exit(1);
}
if(isdigit(argv[1][0])) {
static struct servent s;
servp=&s;
s.s_port=htons((u_short)atoi(argv[1]));
}else if ((servp=getservbyname(argv[1],"tcp")) == 0) {
fprintf(stderr,"%s: unknow service\n");
exit(1);
}
bzero((void *) &server, sizeof server);
server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=servp->s_port;//htons(13)
if (bind(request_sock,(struct sockaddr *) &server, sizeof server )<0) {
perror("bind");
exit(1);
}
if (listen(request_sock,SOMAXCONN)<0 ){
perror("listen");
exit(1);
}
FD_ZERO(&mask);
FD_SET(request_sock, &mask);
maxfd=request_sock;
for(;;){
rmask=mask;
nfound=select(maxfd+1,&mask, (fd_set *)0, (fd_set *)0, &timeout);
if(nfound<0) {
if (errno==EINTR){
printf("interrupted system call\n");
continue;
}
perror("select");
exit(1);
}
if(nfound==0) {
printf("."); fflush(stdout);
continue;
}
if(FD_ISSET(request_sock, &mask)){
addrlen=sizeof(remote);
new_sock=accept(request_sock, (struct sockaddr *)&remote, &addrlen);
if(new_sock<0) {
perror("accept");
exit(1);
}
FD_SET(new_sock, &mask);
if(new_sock>maxfd)
maxfd=new_sock;
FD_CLR( request_sock, &mask);
}
for (fd=0;fd<=maxfd;fd++) {
if(FD_ISSET(fd, &mask)){
bytesread=read(fd, buf, sizeof buf-1);
if(bytesread<0){
perror("read");
}
if(bytesread<=0){
FD_CLR(fd, &mask);
if (close(fd)) perror("close");
continue;
}
buf[bytesread]='\0';
printf("%s: %d ",argv[0],bytesread,fd,buf);
}
}
}
Quote:};