}
int opt =SO_REUSEADDR;
setsockopt(listenfd,SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr= htonl (INADDR_ANY);
if (bind(listenfd,(struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) {
perror("Bind()error.");
exit(1);
}
if(listen(listenfd,BACKLOG)== -1){
perror("listen()error\n");
exit(1);
}
sin_size=sizeof(struct sockaddr_in);
maxfd = listenfd;
maxi = -1;
for (i = 0; i client[i].fd =-1; } FD_ZERO(&allset); FD_SET(listenfd,&allset); { struct sockaddr_in addr; rset = allset; nready =select(maxfd+1, &rset, NULL, NULL, NULL); if ((connectfd =accept(listenfd,(struct sockaddr *)&addr,&sin_size))==-1) { perror("accept() error\n"); continue; } for (i = 0; i if(client[i].fd < 0) { client[i].fd = connectfd; client[i].name = new char[MAXDATASIZE]; client[i].addr = addr; client[i].data = new char[MAXDATASIZE]; client[i].name[0] = '\0'; client[i].data[0] = '\0'; printf("You got a connection from %s. ",inet_ntoa(client[i].addr.sin_addr) ); break; } if (i ==FD_SETSIZE) printf("too many clients\n"); FD_SET(connectfd, &allset); if (connectfd> maxfd) maxfd = connectfd; if (i >maxi) maxi = i; if (--nready<= 0) continue; } if ( (sockfd= client[i].fd) < 0) continue; if(FD_ISSET(sockfd, &rset)) { if ( (n =recv(sockfd, recvbuf, MAXDATASIZE,0)) == 0) { close(sockfd); printf("Client( %s ) closed connection. User's data:%s\n",client[i].name,client[i].data); FD_CLR(sockfd, &allset); client[i].fd = -1; delete client[i].name; delete client[i].data; } else process_cli(&client[i], recvbuf, n); if(--nready <= 0) break; } } } close(listenfd); } { char sendbuf[MAXDATASIZE]; recvbuf[len-1] ='\0'; if(strlen(client->name) == 0) { memcpy(client->name,recvbuf, len); printf("Client'sname is %s.\n",client->name); return; } savedata(recvbuf,len,client->data); for (int i1 = 0; i1< len - 1; i1++) { sendbuf[i1] =recvbuf[len - i1 -2]; } sendbuf[len - 1] ='\0'; } { int start =strlen(data); for (int i = 0; i data[start + i]= recvbuf[i]; } }
while(1)
if(FD_ISSET(listenfd, &rset)) {
for (i = 0; i <=maxi; i++) {
void process_cli(CLIENT *client, char* recvbuf, int len)
printf("Receivedclient( %s ) message: %s\n",client->name, recvbuf);
send(client->fd,sendbuf,strlen(sendbuf),0);
void savedata(char *recvbuf, int len, char *data)