客服端
#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;
}