?? fileserver.c
字號:
/*
Very simple file transferring concurrent server using Linuxthreads.
client ----------------> server
file name
server ---------------->client
file content
Copyright (C) 2004-2006, Li Suke, School of Software and Microelectronics,
Peking University
This is free software; you can redistribute it and/or
modify it freely.
This software is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include "rw.h"
#define BACKLOG 10
void *deal_request(void * arg){
int connfd = *((int *)arg);
char file_name[MAX_LEN];
pthread_detach(pthread_self());
if(read_cmd(connfd,file_name,sizeof(file_name))==-1){
printf("read file name error!\n");
}else{
if(send_file(connfd,file_name)==-1){
printf("Send file error\n");
}
}
free(arg);
close(connfd);
pthread_exit(NULL);
}
int main(int argc, char* argv[]){
int sockfd;
int *connfd;
struct sockaddr_in servaddr;
struct sockaddr_in cliaddr;
struct sockaddr_in tempaddr;
socklen_t templen;
socklen_t clilen;
if((sockfd = socket(AF_INET, SOCK_STREAM,0)) == -1){
perror("socket");
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = 0;
if (bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) == -1)
{
perror("bind");
exit(1);
}
templen = sizeof(struct sockaddr);
if (getsockname(sockfd, (struct sockaddr *)&tempaddr,&templen) == -1){
perror("getsockname");
exit(1);
}
printf("Server is listening on port %d\n", ntohs(tempaddr.sin_port));
if (listen(sockfd,BACKLOG) == -1){
perror("listen");
exit(1);
}
for(;;){
pthread_t th;
clilen = sizeof(cliaddr);
connfd = (int *)malloc(sizeof(int));
*connfd = accept(sockfd,(struct sockaddr *)&cliaddr,&clilen);
if(*connfd == -1){
perror("accept");
continue;
}
if(pthread_create(&th,NULL,deal_request,connfd)!=0){
perror("pthread_create");
break;
}
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -