设为首页 加入收藏

TOP

网络编程TCP总结及实践-C语言(四)
2015-07-24 05:39:08 来源: 作者: 【 】 浏览:27
Tags:网络编程 TCP 总结 实践 语言
#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
首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 1014 Uniform Generator 题解 下一篇POJ 2488:A Knight's Journey

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: