TCP回射服务器

编写一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值