2
#include "myhead.h"
#define SERPORT 9999
#define SERIP "192.168.125.128"
int main(int argc, const char *argv[])
{
int cfd=-1;
if((cfd=socket(AF_INET,SOCK_STREAM,0))==-1){
perror("socket error");
return -1;
}
printf("cfd=%d\n",cfd);
int reuse=1;
if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){
perror("setsockopt error");
return -1;
}
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(SERPORT);
sin.sin_addr.s_addr=inet_addr(SERIP);
socklen_t socklen=sizeof(sin);
if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){
perror("connect error");
return -1;
}
printf("connect success\n");
int newfd=-1;
char buf[128]="";
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(cfd,&readfds);
FD_SET(0,&readfds);
int res=0;
fd_set tempfds;
char wbuf[128]="";
while(1){
tempfds=readfds;
res=select(cfd+1,&tempfds,NULL,NULL,NULL);
if(res==-1){
perror("select error");
return -1;
}else if(res==0){
printf("timeout\n");
return -1;
}
if(FD_ISSET(cfd,&tempfds)){
bzero(wbuf,sizeof(wbuf));
int res=recv(cfd,wbuf,sizeof(wbuf),0);
if(res==0){
printf("服务器已下线\n");
break;
}
printf("[%s:%d]:%s\n",SERIP,SERPORT,wbuf);
}
//判断是否是0号文件描述产生的事件
if(FD_ISSET(0,&tempfds)){
bzero(wbuf,sizeof(wbuf));
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1]=0;
send(cfd,wbuf,sizeof(wbuf),0);
}
}
close(cfd);
return 0;
}
3.
#include "myhead.h"
#define PORT 9999
#define IP "192.168.125.160"
#define MAXSIZE 1024
int main(int argc, const char *argv[])
{
int sfd=-1;
if((sfd=socket(AF_INET,SOCK_STREAM,0))==-1){
perror("socket error");
return -1;
}
printf("sfd=%d\n",sfd);
int reuse=1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){
perror("setsockopt error");
return -1;
}
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT);
sin.sin_addr.s_addr=inet_addr(IP);
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){
perror("bind error");
return -1;
}
printf("bind success _%d_%s_%s\n",__LINE__,__FILE__,__func__);
if(listen(sfd,128)==-1){
perror("listen error");
return -1;
}
printf("listen success _%d_%s_%s\n",__LINE__,__FILE__,__func__);
struct sockaddr_in cin;
socklen_t socklen=sizeof(cin);
struct pollfd fds[1024];
for(int i=0;i<1024;i++){
fds[i].fd=-1;
}
fds[0].fd=0;
fds[0].events=POLLIN;
fds[1].fd=sfd;
fds[1].events=POLLIN;
int newfd=-1;
char buf[128]="";
int res=-1;
char rbuf[128]="";
int count=3;
while(1){
res=poll(fds,MAXSIZE,-1);
if(res<0){
perror("poll error");
return -1;
}else if(res==0){
printf("time out\n");
return -1;
}
if(fds[0].revents==POLLIN){
scanf("%s",buf);
printf("触发终端输入:%s\n",buf);
for(int i=2;i<MAXSIZE;i++){
send(fds[i].fd,buf,sizeof(buf),0);
}
}
if(fds[1].revents==POLLIN){
if((newfd=accept(sfd,(struct sockaddr*)&cin,&socklen))==-1){
perror("accept error");
return -1;
}
printf("[%s:%d]链接成功,newfd=%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);
for(count=2;count<MAXSIZE;count++){
if(fds[count].fd==-1){
fds[count].fd=newfd;
fds[count].events=POLLIN;
break;
}
}
}
for(int i=2;i<MAXSIZE;i++){
if(fds[i].fd>0&&(fds[i].revents==POLLIN)){
int len=read(fds[i].fd,buf,1024);
if(len==0){
close(fds[i].fd);
fds[i].fd=-1;
printf("客户端下线\n");
}else{
printf("read buf:%s\n",buf);
write(fds[i].fd,buf,len);
}
}
}
}
return 0;
}