史啦啦 的学生作业:
【图片】
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BACKLOG 10
void do_sigchild(int sig)
{
wait(NULL);
}
void *do_process_client(void *arg)
{
ssize_t rbytes = 0,sbytes = 0;
char buffer[1024] = {0};
int cfd = *(int *)arg;
for(;;)
{
rbytes = recv(cfd,buffer,sizeof(buffer),0);
if(rbytes == -1)
{
perror("[ERROR] Failed to recv.");
pthread_exit(NULL);
}
else if(rbytes > 0)
{
sbytes = send(cfd,buffer,strlen(buffer),0);
if(sbytes == -1)
{
perror("[ERROR] Failed to recv");
pthread_exit(NULL);
}
}
else if(rbytes == 0)
{
printf("The client has been shutdown.\n");
break;
}
}
close(cfd);
return 0;
}
int main(int argc,char *argv[])
{
int sfd,ret,cfd;
struct sockaddr_in svr_addr,cli_addr;
pthread_t tid;
socklen_t len = sizeof(struct sockaddr_in);
if(argc != 3)
{
fprintf(stderr,"Usage : %s .\n",argv[0]);
exit(EXIT_FAILURE);
}
__sighandler_t sigret;
sigret = signal(SIGCHLD,do_sigchild);
if(sigret == SIG_ERR)
{
perror("[ERROR] Failed to signal.");
exit(EXIT_FAILURE);
}
//创建套接字
sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd == -1)
{
perror("[ERROR] Failed to socket.");
exit(EXIT_FAILURE);
}
bzero(&svr_addr,sizeof(struct sockaddr_in));
svr_addr.sin_family = AF_INET;
svr_addr.sin_port = htons(atoi(argv[2]));
svr_addr.sin_addr.s_addr = inet_addr(argv[1]);
//绑定ip地址和端口号
ret = bind(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr));
if(ret == -1)
{
perror("[ERROR] Failed to bind");
exit(EXIT_FAILURE);
}
ret = listen(sfd,BACKLOG);
if(ret == -1)
{
perror("[ERROR] Failed to listen");
exit(EXIT_FAILURE);
}
for(;;)
{
cfd = accept(sfd,(struct sockaddr *)&cli_addr,&len);
if(cfd == -1)
{
perror("[ERROR] Failed to accept.");
exit(EXIT_FAILURE);
}
printf("ip : %s port : %d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port));
ret = pthread_create(&tid,NULL,do_process_client,(void *)&cfd);
if(ret != 0)
{
fprintf(stderr,"pthread_create(): %s\n",strerror(ret));
exit(EXIT_FAILURE);
}
pthread_detach(tid);
}
close(sfd);
return 0;
}