/*
* =====================================================================================
*
* Filename: server.c
*
* Description:
*
* Version: 1.0
* Created: 2010 02 08
* Revision: none
* Compiler: gcc
*
* Author: Dr. Andy Lee , andyli386@gmail.com
* Company:
*
* =====================================================================================
*/
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define N 1024
#define MYPORT 8000
#define BACKLOG 3
#define TRUE 1
void my_write(int new_sockfd);
int main()
{
struct sockaddr_in my_addr;
struct sockaddr_in client_addr;
int sockfd, ret, client_size, new_sockfd, pid;
client_size = sizeof(client_addr);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket");
exit(1);
}
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bzero(&(my_addr.sin_zero), 8);
ret = bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
if(ret < 0)
{
perror("bind");
exit(1);
}
ret = listen(sockfd, BACKLOG);
if(ret < 0)
{
perror("listen");
exit(1);
}
printf("Waiting for transmission...\n");
while(TRUE)
{
printf("***^^^\n");
new_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_size);
if(new_sockfd < 0)
{
perror("accept");
exit(1);
}
else
{
printf("TCP connect successfully.\n");
printf("Client IP : %s\n", inet_ntoa(client_addr.sin_addr));
}
pid = fork();
if(pid == 0)
{
close(sockfd);
my_write(new_sockfd);
close(new_sockfd);
exit(0);
}
else
{
sleep(1);
}
}
exit(0);
}
void my_write(new_sockfd)
{
int n, pfd;
char recvs[N];
memset(recvs, 0, N);
n = recv(new_sockfd, recvs, N, 0);
pfd = open(recvs, O_TRUNC | O_RDWR | O_CREAT, 0644);
if(pfd < 0)
{
perror("open");
exit(1);
}
while(n)
{
memset(recvs, 0, N);
n = recv(new_sockfd, recvs, N, 0);
if(n == 0)
{
printf("recv over.\n");
break;
}
else
{
write(pfd, recvs, n);
}
}
close(pfd);
}
评论0