日期:2014-05-16  浏览次数:20788 次

UNIX 网络编程中的一个例子
调试书上的例子达不到书上的要求,不知道是哪里出错了,哪位可以帮忙解答下,不胜感激。
服务端程序
#include<iostream>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
//#include<strings.h>
#include<cstring>
#include<cstdlib>
#include<errno.h>
#include<string>
#define LISTENQ 1024
#define SERV_PORT 9877
#define MAXLINE 1000
using namespace std;
void str_echo(int sockfd)
{
size_t n;
char buf[MAXLINE];

again:
while((n=read(sockfd,buf,MAXLINE))>0)
{
write(sockfd,buf,n);
if(n<0&&errno==EINTR)
goto again;
else if (n<0)
cout<<"str_echo:read error"<<endl;
}
string str;


cout<<buf<<endl;
}
int main()
{

int listenfd,connfd,mark;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr,servaddr;
listenfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));//功能是servaddr前n个字符为0;
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htons(SERV_PORT);
// inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
mark=listen(listenfd,LISTENQ);
char stt[48];
cout<<servaddr.sin_addr.s_addr<<endl;
struct in_addr myaddr;
myaddr.s_addr=servaddr.sin_addr.s_addr;
inet_ntop(AF_INET,&(myaddr.s_addr),stt,48);
cout<<stt<<endl;
           cout<<"hello world "<<listenfd<<"  "<<mark<<endl;
// for(;;)
 while(true)
{
cout<<"hello world h"<<endl;

clilen=sizeof(cliaddr);
cout<<"clilen"<<clilen<<endl;
cout<<cliaddr.sin_addr.s_addr<<endl;
inet_ntop(AF_INET,&(cliaddr.sin_addr.s_addr),stt,48);
cout<<stt<<endl;
connfd=accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);
cout<<"connfd"<<connfd<<endl;
if((childpid=fork())==0)
{
close(listenfd);

cout<<"hello world ";
str_echo(connfd);
//
exit(0);
}
close(connfd);
}
cout<<listenfd<<endl;


    return 0;
}

客户端程序
#include<iostream>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<strings.h>
#include<cstdlib>
#include<errno.h>
#include<stdio.h>
#include<string.h>
#define LISTENQ 1024
#define SERV_PORT 9877
#define MAXLINE 1000
using namespace std;
void str_cli(FILE *fp,int sockfd)
{
int m;
cout<<"str_cli success"<<endl;
// cout<<fp.rdstate()<<endl;
char sendline[MAXLINE],recvline[MAXLINE];
while(fgets(sendline,MAXLINE,fp)!=NULL)
{
cout<<"while success"<<endl;
         m=write(sockfd,sendline,st  rlen(sendline));
cout<<" jjjjj "<<m<<endl;
if(read(sockfd,recvline,MAXLINE)==0)
cout<<"err_quit";
fputs(recvline,stdout);
}
}
int main(int argc,char **argv)
{