编写一个TCP回射服务器,客户从标准输入读入一行文本,并写给服务器,服务器从网络输入读入这行文本,并回射给客户。客户从网络输入读入这行回射文本,并显示在标准输出上。
//客户端
#ifndef UNP_H
#define UNP_H
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>
#include<iostream>
#define MAXLINE 100
#define SERV_PORT 9877
using namespace std;
ssize_t Writen(int fd, const char *vptr, size_t n);
ssize_t Readline(int fd, char *vptr, size_t maxlen);
int Socket(int family,int type,int protocol)
{
int n;
if((n=socket(family,type,protocol))<0)
cout<<"socket error";
return n;
}
int Connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen)
{
int n;
if((n=connect(sockfd,servaddr,addrlen))<0)
cout<<"connect error";
return n;
}
void str_cli(FILE* fp,int sockfd)
{
char sendline[MAXLINE],recvline[MAXLINE];
while(fgets(sendline,MAXLINE,fp)!=nullptr)
{
Writen(sockfd,sendline,strlen(sendline));
if(Readline(sockfd,recvline,MAXLINE)==0)
cout<<"read error"<<endl;
fputs(recvline,stdout);
}
}
ssize_t Writen(int fd,const char *vptr,size_t 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(nwritten<0&&errno==EINTR)
nwritten=0;
else
return -1;
}
nleft-=nwritten;
ptr+=nwritten;
}
return n;
}
ssize_t Readline(int fd,char *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)
{
*ptr=0;
return n-1;
}
else
{
if(errno==EINTR)
goto again;
return -1;
}
}
*ptr=0;
return n;
}
#endif // UNP_H
#include"unp.h"
int main(int argc,char** argv)
{
int sockfd;
struct sockaddr_in servaddr;
if(argc!=2)
cout<<"error";
sockfd=Socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
Connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
str_cli(stdin,sockfd);
exit(0);
}
//服务器端
#ifndef UNP_H
#define UNP_H
#define LISTRNQ 100
#define SERV_PORT 9877
#define MAXLINE 100
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<unistd.h>
#include<iostream>
#include<stdio.h>
using namespace std;
int Socket(int family,int type,int protocol)
{
int n;
if((n=socket(family,type,protocol))<0)
cout<<"socket error";
return n;
}
void Listen(int fd,int backlog)
{
char *ptr;
if((ptr=getenv("LISTENQ"))!=nullptr)
backlog=atoi(ptr);
if(listen(fd,backlog)<0)
cout<<"listen error";
}
ssize_t Writen(int fd,char *vptr,size_t 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(nwritten<0&&errno==EINTR)
nwritten=0;
else
return -1;
}
nleft-=nwritten;
ptr+=nwritten;
}
return n;
}
void str_echo(int sockfd)
{
ssize_t n;
char buf[MAXLINE];
again:
while((n=read(sockfd,(void*)buf,MAXLINE))>0)
Writen(sockfd,buf,n);
if(n<0&&errno==EINTR)
goto again;
else if(n<0)
cout<<"read error";
}
#endif // UNP_H
#include"unp.h"
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_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,(struct sockaddr*)&servaddr,sizeof(servaddr));
Listen(listenfd,LISTRNQ);
for(;;)
{
clilen=sizeof(cliaddr);
connfd=accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);
if((childpid=fork())==0)
{
close(listenfd);
str_echo(connfd);
exit(0);
}
}
close(connfd);
}
会用g++ -std=c++11 main.cpp -o main 不然不会包括nullptr
2374

被折叠的 条评论
为什么被折叠?



