unix回射服务器,客服端

客服端

#include<sys/socket.h>
#include<sys/types.h>
#include<string.h>
#include<sys/errno.h>
#include<netinet/in.h>
#include<sys/select.h>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<arpa/inet.h>
using namespace std;
#define PORT 7000
#define EXIT_ERR(m) \
do{\
perror(m);\
printf("\n");\
exit(0);\
}while(0)

ssize_t writen(int fd,char *vptr,size_t n);
int readn(int fd,void *vptr,size_t n);
int main(){
    int sock=socket(AF_INET,SOCK_STREAM,0);
    sockaddr_in saddr;
    bzero(&saddr,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(PORT);
    inet_pton(AF_INET,"127.0.0.1", &saddr.sin_addr.s_addr);是这样的吗?

    if(connect(sock,(sockaddr * )&saddr,sizeof(saddr))<0)
        EXIT_ERR("connect error");

    printf("connect succes\n");

    char buff[100];
    int maxfdp1;
    fd_set rset;
    while(true){
        FD_ZERO(&rset);
        FD_SET(fileno(stdin),&rset);
        FD_SET(sock,&rset);
        maxfdp1=max(fileno(stdin),sock)+1;
        select(maxfdp1,&rset,0,0,0);
        if(FD_ISSET(fileno(stdin),&rset)==1){
            if( scanf("%s",buff)==EOF)
                    break;
            writen(sock,buff,strlen(buff));
        }

       // write(sock,"1",1);
        char buff2[100];
        bzero(buff2,sizeof(buff2));
        if(FD_ISSET(sock,&rset)){
             if(read(sock,buff2,100)==0)
            EXIT_ERR("ser closed");
            printf("%s\n",buff2);
        }


    }
    shutdown(sock,  SHUT_WR);
    exit(EXIT_SUCCESS);

}

int readn(int fd,void *vptr,size_t n){
	size_t nleft;
	ssize_t nread;
	char *ptr;
	ptr=(char *)vptr;
	nleft=n;
	while(nleft>0){
		if((nread=read(fd,ptr,nleft))<0){
			if(errno ==EINTR)
				nread=0;
			else
				return -1;
		}
		else if(nread==0)
			break;
		ptr+=nread;
		nleft-=nread;

	}
    printf("readn success\n");
	return n-nleft;

}

ssize_t writen(int fd,char *vptr,size_t n){
	char * ptr=vptr;
	int nleft=n;
	ssize_t nwritten;
	while(nleft>0){
		if((nwritten=write(fd,ptr,nleft))<=0){
			if(nwritten<0 && errno==EINTR)
				nwritten=0;
			else
				return -1;
		}
		nleft-=nwritten;
		ptr+=nwritten;
	}
    printf("writen success\n");
	return n;
}


服务端:

#include<sys/socket.h>
#include<sys/types.h>
#include<string.h>
#include<netinet/in.h>
#include<errno.h>
#include<stdio.h>
#include<sys/wait.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<signal.h>
#define PORT 7000
#define EXIT_ERR(m) \
do{\
perror(m);\
printf("\n");\
exit(0);\
}while(0)

void sighander(int );
void echo(int fd);
ssize_t writen(int fd,char *vptr,size_t n);
int readn(int fd,void *vptr,size_t n);
int main(void)
{
    int listenfd=socket(AF_INET,SOCK_STREAM,0);
    sockaddr_in seraddr;
    bzero(&seraddr,sizeof(seraddr));
    seraddr.sin_family=AF_INET;
    seraddr.sin_port=htons(PORT);
    seraddr.sin_addr.s_addr=htonl(INADDR_ANY);

    if(bind(listenfd,(sockaddr *)&seraddr,sizeof(seraddr))<0)
        EXIT_ERR("bind error");
    if(listen(listenfd,100)<0)
        EXIT_ERR("listen error");

    signal(SIGCHLD,sighander);

    while(true){
        int  connfd;
        sockaddr_in cliaddr;
        bzero(&cliaddr,sizeof(cliaddr));
        socklen_t len=sizeof(cliaddr);
        if((connfd=accept(listenfd,(sockaddr *)&cliaddr,(socklen_t *)&len))<0){
            if(errno==EINTR){
                printf("accept intrupted\n");
                continue;
            }
        }

        char str[100];
        printf("connect ip %s  success\n",inet_ntop(AF_INET,(sockaddr *)&cliaddr.sin_addr.s_addr,str  ,100));
        pid_t pid=fork();
        if(pid==0){
            close(listenfd);
            sockaddr_in caddr;
            socklen_t len=sizeof(caddr);
            getpeername(connfd,(sockaddr *)&caddr,(socklen_t *)&len);
            printf("pid %d ppid %d  port %d\n",getpid(),getppid(),ntohs(caddr.sin_port));
            echo(connfd);
            exit(EXIT_SUCCESS);
        }
        else if(pid>0)
            close(connfd);
            else{
                  printf("fork error\n");
                  return 0;
            }

    }

}

void echo(int fd){
    char buff[100];
    bzero(buff,sizeof(buff));
    int flag;
    while((flag=read(fd,buff,100))>0)
    {
        printf("%s\n",buff);
        writen(fd,buff,strlen(buff));
        bzero(buff,sizeof(buff));
    }
    if(flag==0)
        EXIT_ERR("client closed");
    if(flag==-1)
        EXIT_ERR("read error");
}

void sighander(int sig){
    pid_t pid ;
    int stat;
    while((pid=waitpid(-1,&stat,WNOHANG)>0))
          printf("child  %d termite with %d\n",pid,stat);
}



int readn(int fd,void *vptr,size_t n){
	size_t nleft;
	ssize_t nread;
	char *ptr;
	ptr=(char *)vptr;
	nleft=n;
	while(nleft>0){
		if((nread=read(fd,ptr,nleft))<0){
			if(errno ==EINTR)
				nread=0;
			else
				return -1;
		}
		else if(nread==0)
			break;
		ptr+=nread;
		nleft-=nread;

	}
    printf("readn success\n");
	return n-nleft;

}

ssize_t writen(int fd,char *vptr,size_t n){
	char * ptr=vptr;
	int nleft=n;
	ssize_t nwritten;
	while(nleft>0){
		if((nwritten=write(fd,ptr,nleft))<=0){
			if(nwritten<0 && errno==EINTR)
				nwritten=0;
			else
				return -1;
		}
		nleft-=nwritten;
		ptr+=nwritten;
	}
    printf("writen success\n");
	return n;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值