- 论坛徽章:
- 0
|
socket编程
#include <sys/types.h>;
#include <sys/socket.h>;
#include <netinet/in.h>;
#include <unistd.h>;
#include <arpa/inet.h>;
#include <string.h>;
#include <stdlib.h>;
#include <stdio.h>;
#include <time.h>;
#define PORT 5000
#define MAXSOCKFD 10
void GetSystemTime();
char timebuf[256];
main()
{
int sockfd,newsockfd,is_connected[MAXSOCKFD],fd;
struct sockaddr_in addr;
int addr_len=sizeof(struct sockaddr_in);
fd_set readfds;
char buf[256];
char msg[]="Welcome to Server!";
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket"
exit(1);
}
bzero(&addr,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&addr,sizeof(addr))<0)
{
perror("bind"
exit(1);
}
if(listen(sockfd,3)<0)
{
perror("listen"
exit(1);
}
/*清除连线状态旗标*/
for(fd=0;fd<MAXSOCKFD;fd++)
is_connected[fd]=0;
while(1)
{
FD_ZERO(&readfds);
FD_SET(sockfd,&readfds);
GetSystemTime();
for(fd=0;fd<MAXSOCKFD;fd++) //检查每个客户端是否已经连接上的
{
if(is_connected[fd])
FD_SET(fd,&readfds);
}
if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))
continue;
/*判断是否有连线或者新信息进来*/
for(fd=0;fd<MAXSOCKFD;fd++)
{
if(FD_ISSET(fd,&readfds)) //判断fd是否在socket集合中
{
if(sockfd==fd) //接受新连线
{
/*接受新的连接*/
if((newsockfd=accept(sockfd,(struct sockaddr *)&addr,&addr_len))<0)
perror("accept"
printf("当前newsockfd值:%d\n",newsockfd);
write(newsockfd,msg,sizeof(msg));
is_connected[newsockfd]=1;
printf("来自: %s 的连接\n",inet_ntoa(addr.sin_addr));
}
else //接受新信息
{
bzero(buf,sizeof(buf));
if(read(fd,buf,sizeof(buf))<=0)
{
printf("%s已断开\n",inet_ntoa(addr.sin_addr));
is_connected[fd]=0;
close(fd);
}
else
{
printf("%s\n",buf);
}
}
if(is_connected[newsockfd])
{
sleep(1);
write(newsockfd,timebuf,sizeof(timebuf));
}
}
}
}
}
这是服务端的代码,有什么问题吗? |
|