之前写的那个socket太次了。只能连一个,所以优化了一下。我管他叫superserver。
代码献上:
//server.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc,const char* argv[])
{
if(argc != 3)
{
printf("Usage:%s [loacl_ip] [loacl_port]\n",argv[0]);
return 1;
}
int fd=socket(AF_INET,SOCK_STREAM,0);
if(fd<0)
{
perror("socket error!");
exit(1);
}
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr(argv[1]);
addr.sin_port=htons(atoi(argv[2]));
int bd=bind(fd,(struct sockaddr*)&addr,sizeof(addr));
if(bd<0)
{
perror("bind error!");
exit(2);
}
int li=listen(fd,5);
if(li<0)
{
perror("listen error!");
exit(3);
}
struct sockaddr_in client;
socklen_t len=sizeof(struct sockaddr_in);
while(1)
{
int sock=accept(fd,(struct sockaddr*)&client,&len);
if(sock<0)
{
perror("accept error!");
continue;
}
printf("client's ip:%s,port:%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
pid_t pid;
pid=fork();
if(pid<0)
{
perror("pid creat error!");
exit(4);
}
else if(pid>0)
{
close(sock);
continue;
}
else
{
while(1)
{
char buf[1024];
while(1)
{
ssize_t s=read(sock,buf,sizeof(buf)-1);
if(s>0)
{
buf[s]=0;
printf("client:%s",buf);
}
else
{
printf("port:%d quit!\n",ntohs(client.sin_port));
return 0;
}
}
}
break;
close(sock);
}
}
close(fd);
return 0;
}
来,看下效果:
棒,哈哈哈哈。
告辞,这篇博文就是这么开心。