本人愚笨,加上没有基础,搞了一个多星期才搞出了聊天室的服务器端程序,反思ing。。。。
中间碰到点问题,只有点对点通信,无法多客户端同时通信,看了好久才发现原来没有把新的套接字加到套接字集合里去,所以新的accept进来是没有反应的,郁闷..
贴下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <sys/time.h>
#define MAXBUF 1024
#define PORT 8888 //myport
#define BACKLOG 10 //max connections
int main()
{
int sockfd,newfd[BACKLOG],maxfd,i = 0,j;
char buf[MAXBUF + 1];
fd_set fds;
socklen_t len;
struct sockaddr_in serv_addr,cli_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr));
listen(sockfd, BACKLOG);
for(i = 0; i <BACKLOG; i++)
{
newfd[i] = -1; //所有sockfd置为-1
}
i = 0;
while(1)
{
printf("Head/n");
FD_ZERO(&fds); //置空fds
FD_SET(0, &fds);
maxfd = 0;
FD_SET(sockfd,&fds);
if(sockfd >= maxfd)
maxfd = sockfd;
for(j = 0; j< i;j++) //add new sockfd to fds
{
FD_SET(newfd[j],&fds);
if(newfd[j] >= maxfd) //find maxfd
maxfd = newfd[j];
}
select(maxfd+1, &fds,NULL,NULL,NULL);
if(FD_ISSET(sockfd, &fds)) //accept new connection
{
printf("in accept/n");
len = sizeof(struct sockaddr);
newfd[i] = accept(sockfd, (struct sockaddr *)&cli_addr, &len);
FD_SET(newfd[i], &fds);
if(newfd[i] > maxfd)
maxfd = newfd[i];
printf("accept/n");
i++;
}
for(j = 0 ;j < i; j++) //send message
{
if(FD_ISSET(0, &fds))
{
bzero(buf, MAXBUF + 1);
fgets(buf, MAXBUF, stdin);
len = send(newfd[j], buf, strlen(buf)-1, 0);
if(len > 0)
printf("Message send success:%s",buf);
}
}
for(j = 0; j < i; j++) //receive message
{
if(FD_ISSET(newfd[j], &fds))
{
printf("in receive,j = %d,i=%d/n",j,i);
bzero(buf, MAXBUF + 1);
len = recv(newfd[j], buf, MAXBUF, 0);
if(len > 0)
printf("Message received success:%s/n",buf);
}
}
if(len <= 0)break;
}
close(sockfd);
return 0;
}