天天看点

linux c select tcp异步客户端,这几天在看socket select()实现异步IO的网络聊天室..

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

源码 加其他,需要的拿去看看吧...

注:为linux环境下的,win的请绕道吧..

//简单的select()应用,网络聊天室

//服务器端..

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define BUFSIZE 256

#define PORT 8888

int main(int argc,char *argv[])

{

int fd=socket(AF_INET,SOCK_STREAM,0);

int fdclient[BUFSIZE]; //客户描述符

char buf[BUFSIZE];

int count=0;// 客户个数

fd_set fds;//监听的描述符集合

int res;//做异常处理

int maxfd=0;//最大的描述符

memset(fdclient,-1,BUFSIZE);

int index;

if(-1 == fd)

{

perror("get fd error");

exit(-1);

}

struct sockaddr_in serveraddr,clientaddr;

serveraddr.sin_family=AF_INET;

serveraddr.sin_port=htons(PORT);

serveraddr.sin_addr.s_addr=inet_addr("192.168.1.103");

if(bind(fd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr_in))==-1)

{

close(fd);

perror("bind error");

exit(-1);

}

if(listen(fd,10)==-1)

{

close(fd);

perror("listen error");

exit(-1);

}

int len=sizeof(clientaddr);

int i;

while(1)

{

FD_ZERO(&fds);

maxfd=0;

FD_SET(fd,&fds);

maxfd=maxfd>=fd?maxfd:fd;

for(i=0;i

{

if(fdclient[i]!=-1)

{

FD_SET(fdclient[i],&fds);

maxfd=maxfd>=fdclient[i]?maxfd:fdclient[i];

}

}

printf("waiting connect\n");

res=select(maxfd+1,&fds,0,0,0);

int len=sizeof(clientaddr);

if(FD_ISSET(fd,&fds))

{

int sockfd=accept(fd,(struct sockaddr*)&clientaddr,&len);

if(sockfd == -1)

{

perror("服务器崩溃");

close(fd);

exit(-1);

}

fdclient[count]=sockfd;

printf("客户链接 IP:%s:%d\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));

count++;

}

for(i=0;i

{

if(fdclient[i]!=-1 && FD_ISSET(fdclient[i],&fds))

{

res=recv(fdclient[i],buf,BUFSIZE,0);

if(res==0)

{

printf("客户端断开链接\n");

close(fdclient[i]);

fdclient[i]=-1;

}

else if(res == -1)

{

printf("网络错误\n");

close(fdclient[i]);

fdclient[i]=-1;

}

else if(res>0)

{

for(index=0;index

{

if(fdclient[index]!=-1)

send(fdclient[index],buf,res,0);

}

}

}

}

}

return 0;

}

// //

// //

// //

//客户端..

#include

#include

#include

#include

#include

#include

#include

#define PORT 8888

#define BUFSIZE 256

#define CLEAR printf("\033[2J");

#define SETPOS(x,y) printf("\033[%d;%dH",x,2*y);

int main(int argc,char *argv[])

{

if(argc<2)

{

printf("请输入用户名在登陆\n");

exit(-1);

}

printf("%s\n",argv[1]);

int fd=socket(AF_INET,SOCK_STREAM,0);

char sendbuf[BUFSIZE];

char buf[BUFSIZE];

if(fd==-1)

{

perror("get socket fd error");

exit(-1);

}

struct sockaddr_in serveraddr;

serveraddr.sin_family=AF_INET;

serveraddr.sin_port=htons(PORT);

serveraddr.sin_addr.s_addr=inet_addr("192.168.1.103");

//CLEAR;

//SETPOS(10,10);

if(connect(fd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))==-1)

{

perror("connect error");

close(fd);

exit(-1);

}

printf("connect server successed,welcom:%s\n",argv[1]);

int i;

int pid=fork();

if(pid==0)

{

while(1)

{

memset(buf,*\0*,BUFSIZE);

int res=recv(fd,buf,BUFSIZE,0);

if(res>0)

{

printf("%s\n",buf);

}

}

}

while(1)

{

memset(buf,*\0*,BUFSIZE);

memset(sendbuf,*\0*,BUFSIZE);

gets(buf);

strcat(sendbuf,argv[1]);

strcat(sendbuf,":");

strcat(sendbuf,buf);

send(fd,sendbuf,BUFSIZE,0);

memset(buf,*\0*,BUFSIZE);

}

close(fd);

return 0;

}

///运行解图..

linux c select tcp异步客户端,这几天在看socket select()实现异步IO的网络聊天室..