/-----------------------------------server.c---------------------------------------/
#include <func.h>
int main(int argc,char *argv[])
{
int ret=0;
int sfd=socket(AF_INET,SOCK_STREAM,0);
ERROR_CHECK(sfd,-1,"socket");
struct sockaddr_in serAddr;
memset(&serAddr,0,sizeof(serAddr));
serAddr.sin_family=AF_INET;
serAddr.sin_port=htons(atoi(argv[2]));
serAddr.sin_addr.s_addr=inet_addr(argv[1]);
socklen_t reuse=1;
setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse));
ret=bind(sfd,(struct sockaddr*)&serAddr,sizeof(serAddr));
ERROR_CHECK(ret,-1,"bind");
ret=listen(sfd,10);
ERROR_CHECK(ret,-1,"listen");
int newfd=0;
fd_set rdset;
fd_set needMonitorSet;
FD_ZERO(&rdset);
FD_ZERO(&needMonitorSet);
FD_SET(STDIN_FILENO,&needMonitorSet);
FD_SET(sfd,&needMonitorSet);
char buf[64]={0};
struct sockaddr_in cliAddr;
memset(&cliAddr,0,sizeof(cliAddr));
socklen_t len=sizeof(cliAddr);
int readyNum=0;
while(1){
memcpy(&rdset,&needMonitorSet,sizeof(fd_set));
readyNum=select(10,&rdset,NULL,NULL,0);
for(int i=0;i<readyNum;++i){
if(FD_ISSET(STDIN_FILENO,&rdset)){
memset(buf,0,sizeof(buf));
read(STDIN_FILENO,buf,sizeof(buf));
send(newfd,buf,strlen(buf)-1,0);
}
if(FD_ISSET(newfd,&rdset)){
memset(buf,0,sizeof(buf));
ret=recv(newfd,buf,sizeof(buf)-1,0);
if(ret==0){
printf("goodbye!\n");
close(newfd);
FD_CLR(newfd,&needMonitorSet);
continue;
}
printf("client message:%s\n",buf);
}
if(FD_ISSET(sfd,&rdset)){
newfd=accept(sfd,(struct sockaddr*)&cliAddr,&len);
ERROR_CHECK(newfd,-1,"accept");
printf("client ip=%s\n",inet_ntoa(cliAddr.sin_addr));
printf("client prot=%d\n",ntohs(cliAddr.sin_port));
FD_SET(newfd,&needMonitorSet);
printf("connecting success\n");
}
}
}
close(sfd);
close(newfd);
return 0;
}
/-----------------------------------client.c---------------------------------------/
#include <func.h>
int main(int argc ,char *argv[])
{
int ret=0;
int sfd=socket(AF_INET,SOCK_STREAM,0);
ERROR_CHECK(sfd,-1,"socket");
struct sockaddr_in serAddr;
memset(&serAddr,0,sizeof(serAddr));
serAddr.sin_family=AF_INET;
serAddr.sin_addr.s_addr=inet_addr(argv[1]);
serAddr.sin_port=htons(atoi(argv[2]));
ret=connect(sfd,(struct sockaddr*)&serAddr,sizeof(serAddr));
ERROR_CHECK(ret,-1,"connect");
fd_set rdset;
FD_ZERO(&rdset);
char buf[64]={0};
int readyNum=0;
while(1){
FD_SET(STDIN_FILENO,&rdset);
FD_SET(sfd,&rdset);
readyNum=select(sfd+1,&rdset,NULL,NULL,0);
for(int i=0;i<readyNum;++i){
if(FD_ISSET(STDIN_FILENO,&rdset)){
memset(buf,0,sizeof(buf));
read(STDIN_FILENO,buf,sizeof(buf));
send(sfd,buf,strlen(buf)-1,0);
}
if(FD_ISSET(sfd,&rdset)){
memset(buf,0,sizeof(buf));
recv(sfd,buf,sizeof(buf)-1,0);
printf("server message:%s\n",buf);
}
}
}
close(sfd);
return 0;
}