|
发表于 2004-1-13 10:16:33
|
显示全部楼层
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <netinet/ip.h>
- #include <netinet/tcp.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <netdb.h>
- #include <error.h>
- #include <errno.h>
- /*#include <readline/readline.h>
- #include <readline/history.h>
- */
- #define SERV_PORT 9999
- #define MAXLINE 4096
- #define LISTENQ 1024
- ssize_t writen(int fd,const void * vptr,long n)
- {
- size_t nleft;
- ssize_t nwritten;
- const char * ptr;
- ptr=vptr;
- nleft=n;
- while (nleft>0){
- if((nwritten=write(fd,ptr,nleft))<=0){
- if(errno==EINTR)
- nwritten=0;
- else
- return(-1);
- }
- nleft-=nwritten;
- ptr+=nwritten;
- }
- return(0);
- }
- ssize_t readline(int fd,void * vptr,size_t maxlen)
- {
- ssize_t n,rc;
- char c,* ptr;
- ptr=vptr;
- for(n=1;n<maxlen;n++){
- again:
- if((rc=read(fd,&c,1))==1){
- *ptr++=c;
- if(c=='\n')
- break;
- }else if (rc==0){
- if (n==1)
- return(0);
- else
- break;
- }else {
- if (errno==EINTR)
- goto again;
- return (-1);
- }
- }
- *ptr=0;
- return(n);
- }
- void str_echo(int sockfd)
- {
- long n;
- char line[MAXLINE];
- for(;;){
- if ((n=readline(sockfd,line,MAXLINE))==0)
- return;
- writen(sockfd,line,n);
- }
- }
- int main(int argc,char **argv)
- {
- int listenfd,connfd;
- long childpid;
- socklen_t clilen;
- struct sockaddr_in cliaddr,servadd;
- listenfd=socket(AF_INET,SOCK_STREAM,0);
- bzero(&servadd,sizeof(servadd));
- servadd.sin_family=AF_INET;
- servadd.sin_addr.s_addr=htonl(INADDR_ANY);
- servadd.sin_port=htons(SERV_PORT);
- bind(listenfd,(struct sockaddr *)&servadd,sizeof(servadd));
- listen(listenfd,LISTENQ);
- for(;;){
- clilen=sizeof(cliaddr);
- connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);
- if((childpid=fork())==0){
- close(listenfd);
- str_echo(connfd);
- exit(0);
- }
- close(connfd);
- }
- }
复制代码
这是我在rh8下改写的回射服务器版本。client端好象给我改掉了。。。找不到了,找到贴给你参考下
有些头文件其实不需要的,我不高兴去掉。。。。。 |
|