- 论坛徽章:
- 0
|
编译过程中出现错误
EINTR 未声明
源代码如下:
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <netinet/in.h>
#include <stdlib.h>
#define MAXLINE 1024
#define SA struct sockaddr
#define SERV_PORT 9877
extern int errno;
int /* Write "n" bytes to a descriptor. */
writen(int fd, const void *vptr, size_t n)
{
size_t nleft;
int nwritten;
const char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
if (nwritten < 0 && errno == EINTR)
nwritten = 0; /* and call write() again */
else
return(-1); /* error */
}
nleft -= nwritten;
ptr += nwritten;
}
return(n);
}
/* end writen */
void
str_echo(int sockfd)
{
int n;
char buf[MAXLINE];
again:
while ( (n = read(sockfd, buf, MAXLINE) ) >0)
writen(sockfd, buf, n) ;
if (n<0 && errno == EINTR)
goto again;
else if (n <0)
printf("str_echo: read erro\n") ;
}
int
main(int argc,char **argv)
{
int listenfd,connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
listenfd = socket(AF_INET, SOCK_SOCK_STREAM, 0) ;
bzero(&servaddr,sizeof(servaddr)) ;
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY) ;
servaddr.sin_port = htons(SERV_PORT) ;
bind(listenfd, (SA *)&servaddr, sizeof(servaddr)) ;
listen(listenfd,LISTENQ) ;
for( ; ; ) {
clilen = sizeof(cliaddr) ;
connfd = accept(listenfd, (SA *) &cliaddr, &clilen) ;
if ( (childpid = fork() ) == 0) {
close(listenfd) ;
str_echo(connfd) ;
exit(0) ;
}
close(connfd) ;
}
}
编译时的命令是:
make serv
请不吝赐教! |
|