#include"tcp.h"
static void Usage(const char* proc){
printf("USage:%s[local_ip][local_port]\n",proc);
}
int Start(const char* ip,int port){
int fd = socket(AF_INET,SOCK_STREAM,0);
if(fd < 0){
perror("socket");
return -1;
}
struct sockaddr_in serv;
serv.sin_family = AF_INET;
serv.sin_port = htons(PORT);
serv.sin_addr.s_addr = inet_addr(ip);
int bfd = bind(fd, (struct sockaddr *)&serv,sizeof(serv));
if(bfd < 0){
perror("bind");
return -1;
}
int lfd = listen(fd,SUM);
if(lfd < 0){
perror("listen");
return -1;
}
return fd;
}
int main(int argc, char* argv[]){
if(argc != 3){
Usage(argv[0]);
return 1;
}
int lfd = Start(argv[1],atoi(argv[2]));
while(1){
struct sockaddr_in client;
socklen_t len = sizeof(client);
int new_fd = accept(lfd,
(struct sockaddr *)&client,&len);
if(new_fd < 0){
perror("accept");
return -1;
}
printf("connected ip:%s,port:%u\n"
,inet_ntoa(client.sin_addr),ntohs(client.sin_port));
pid_t pid = fork();
if(pid < 0){
perror("fork");
close(new_fd);
}
else if(pid == 0){
close(lfd);
if(fork() > 0){
return -1;
}
while(1){
char buf[2048];
ssize_t r = read(new_fd,buf,sizeof(buf)-1);
if(r > 0){
buf[r] = '\0';
printf("client#%s\n",buf);
write(new_fd,buf,strlen(buf));
}
else if(r == 0){
printf("client exit\n");
break;
}
else{
perror("read");
break;
}
}
close(new_fd);
exit(0);
}
else{
close(new_fd);
waitpid(pid,NULL,0);
}
}
return 0;
}