网络编程TCP总结及实践-C语言(四)

2015-07-24 05:39:08 · 作者: · 浏览: 35
#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