#include
#include
#include
#include
#include
#include
#define MSG_SIZE 8188 #define MSG_LEN (8192 - MSG_SIZE) typedef struct tag { int s_len ; char s_buf[MSG_SIZE]; } MSG; int listenfd_init(char* ip, char* port); void handle_request(int fd_client); #endif
#include "my_socket.h"
int listenfd_init(char* ip, char* port)
{
int fd_server ;
struct sockaddr_in server_addr ;
int reuse = 1 ;
if((fd_server = socket(AF_INET,SOCK_STREAM, 0) ) == -1)
{
perror("socket");
exit(-1);
}
if(0 != setsockopt(fd_server,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(int)))
{
perror("setsockopt");
close(fd_server);
exit(-1);
}
memset(&server_addr, 0 , sizeof(server_addr)) ;
server_addr.sin_family = AF_INET ;
server_addr.sin_port = htons(atoi(port));
server_addr.sin_addr.s_addr = inet_addr(ip);
if(-1 == bind(fd_server,(struct sockaddr*)&server_addr,sizeof(server_addr)))
{
perror("bind");
close(fd_server);
exit(-1);
}
if(-1 == listen(fd_server,5))
{
perror("listen");
close(fd_server);
exit(-1);
}
return fd_server ;
}
void handle_request(int fd_client)
{
int fd_file ;
int read_n ;
MSG msg,snd_msg ;
memset(&msg,0, sizeof(msg));
recv(fd_client,&msg, MSG_LEN , 0) ;
recv(fd_client,&msg.s_buf,msg.s_len,0) ;
printf("recv msg :%s \n", msg.s_buf);
fd_file = open(msg.s_buf,O_RDONLY);
while(memset(&snd_msg,0,sizeof(msg)), (read_n = read(fd_file,snd_msg.s_buf,MSG_SIZE)) > 0)
{
snd_msg.s_len = read_n ;
send(fd_client, &snd_msg, snd_msg.s_len + MSG_LEN ,0);
}
snd_msg.s_len = 0 ;
send(fd_client, &snd_msg, snd_msg.s_len + MSG_LEN ,0);
close(fd_file);
close(fd_client);
}
#include "mysocket.h"
int main(int argc,char *argv[])//ip port
{
if(argc!=3)
{
printf("too few argument!\n");
exit(-1);
}
int fd_sever,fd_client,fd_file;
int reuse=1;//使IP可以重用
struct sockaddr_in sever_addr,client_addr;
int addrlen=sizeof(client_addr);
int read_n;
// char file_name[128]="";
MSG msg,snd_msg;//8K
if((fd_sever=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("open");
exit(-1);
}
if(0!=setsockopt(fd_sever,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(int)))
{
perror("setopt");
close(fd_sever);
exit(-1);
}
memset(&sever_addr,0,sizeof(sever_addr));
sever_addr.sin_family=AF_INET;//ipv4
sever_addr.sin_port=htons(atoi(argv[2]));
sever_addr.sin_addr.s_addr=inet_addr(argv[1]);
//绑定
if(-1==bind(fd_sever,(struct sockaddr*)&sever_addr,sizeof(sever_addr)))
{
perror("bind");
close(fd_sever);
exit(-1);
}
printf("bind success!\n");
if(-1==listen(fd_sever,0))
{
perror("listen");
close(fd_sever);
exit(-1);
}
printf("listen success\n");
while(fd_client=accept(fd_sever,(struct sockaddr *)&client_addr,&addrlen))//不想接受信息可以不填写结构体 NULL
{
printf("client connect:%s:%d\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));//网络端口和IP转为主机模式
// memset(file_name,0,128);
memset(&msg,0,sizeof(msg));
//msg用于保存文件名极其大小
recv(fd_client,&msg.s_len,MSG_LEN,0);//先收长度,再收文件名
recv(fd_client,&msg.s_buf,msg.s_len,0);
printf("recvmsg:%s\n",msg.s_buf);
fd_file=open(msg.s_buf,O_RDONLY);//snd_msg
while(memset(&snd_msg,0,sizeof(snd_msg)),(read_n=rea