myserver myclient

myserver


#include <unistd.h>
#include <netinet/in.h>    // for sockaddr_in
#include <sys/types.h>    // for socket
#include <sys/socket.h>    // for socket
#include <stdio.h>        // for printf
#include <stdlib.h>        // for exit
#include <string.h>        // for bzero




#define PORT_NUM 6666 
#define LISTEN_MAX 20
#define FILENAME_LEN 512 
#define BUF_MAX_LEN 1024

int main(int argc, char **argv)
{
	
	


	//建立server主机信息
	//设置一个socket地址结构server_addr,代表服务器internet地址, 端口
	struct sockaddr_in server_addr;
	bzero(&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(PORT_NUM);
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

	//建立socket
	//创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket

	int socket_server_fd;	//socket 返回值
	socket_server_fd = socket(AF_INET, SOCK_STREAM, 0);
	if(socket_server_fd == -1)
	{
		perror("socket create failed\n");
		exit(1);
	}


	int opt =1;
 	setsockopt(socket_server_fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));


	//bind //把socket和socket地址结构联系起来
	socklen_t server_addrlen = sizeof(server_addr);
	if ( bind(socket_server_fd, (struct sockaddr *)&server_addr, server_addrlen) == -1)
	{
		perror("bind failed\n");
		exit(1);
	}

	//listen
	if( listen(socket_server_fd, LISTEN_MAX) == -1)
	{
		perror("listen failed\n");
		exit(1);
	
	}

	while(1)
	{
		//建立client主机信息 //定义客户端的socket地址结构client_addr
		struct sockaddr_in client_addr;
		//bzero(&client_addr, sizeof(client_addr));
		//client_addr.sin_family = AF_INET;
		//client_addr.sin_port = htons(PORT_NUM);
		//client_addr.sin_addr.s_addr = htonl(INADDR_ANY);

		//接受一个到server_socket代表的socket的一个连接
	   	//如果没有连接请求,就等待到有连接请求--这是accept函数的特性
    		//accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信
   		//new_server_socket代表了服务器和客户端之间的一个通信通道
 	   	//accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中

		socklen_t client_addrlen = sizeof(client_addr);

		int server_client_fd;
		server_client_fd = accept(socket_server_fd, (struct sockaddr *)&client_addr, &client_addrlen);
		if(server_client_fd == -1)
		{
			perror("accept failed\n");
			exit(1);
		}
		
		//int fread_len = fread(filename, sizeof(char), FILENAME_LEN, server_client_fd);

		//从客户端读取数据
		char buf[BUF_MAX_LEN];
		bzero(buf, BUF_MAX_LEN);
		recv(server_client_fd, buf, BUF_MAX_LEN, 0);

		char filename[FILENAME_LEN];
		bzero(filename, FILENAME_LEN);
		strncpy(filename, buf, strlen(buf)>FILENAME_LEN ? FILENAME_LEN : strlen(buf));

		printf("%s\n",filename);
		FILE *fp = fopen(filename, "r");
		if(fp == NULL)
		{
			perror("fopen failed....ll\n");
			exit(1);
		}

		//begin send file
		printf("send %s...\n", filename);
		int fread_buf_len;
		while( (fread_buf_len = fread(buf, sizeof(char), BUF_MAX_LEN, fp)) )
		{
		//	fwrite(buf, sizeof(char), fread_buf_len, server_client_fd);
			printf("file_block_length(fread_buf_len) = %d\n",fread_buf_len);
			write(server_client_fd, buf, fread_buf_len);
		}
		printf("send %s ok\n", filename);

		fclose(fp);

		close(server_client_fd);
		
	
	}
	close(socket_server_fd);
	return 0;
}





 myclient


#include <arpa/inet.h>
#include <netinet/in.h>    // for sockaddr_in
#include <sys/types.h>    // for socket
#include <sys/socket.h>    // for socket
#include <stdio.h>        // for printf
#include <stdlib.h>        // for exit
#include <string.h>        // for bzero
#include <unistd.h>


#define PORT_NUM 6666
#define LISTEN_MAX 20
#define FILENAME_LEN 512 
#define BUF_MAX_LEN 1024

int main(int argc, char **argv)
{


	struct sockaddr_in client_addr;
	int socket_client = socket(AF_INET, SOCK_STREAM, 0);

	//设置一个socket的sockaddr_in的结构体,存server的internet地址,端口
	struct sockaddr_in server_addr;
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(PORT_NUM);
	if ( inet_aton(argv[1], &server_addr.sin_addr) == 0 )	
	{
       		printf("Server IP Address Error!\n");
       		exit(1);		
	}

	 
	socklen_t server_addr_len = sizeof(server_addr);
	//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接
	if ( connect(socket_client, (struct sockaddr *)&server_addr, server_addr_len) < 0 )
	{
		printf("Can Not Connect To %s!\n",argv[1]);
        	exit(1);
	}

	char filename[FILENAME_LEN];
	bzero(filename, FILENAME_LEN);

	char buf[BUF_MAX_LEN];
	bzero(buf, BUF_MAX_LEN);
	printf("Input get filename:\n"); 
	scanf("%s", buf);
	//gets(buf);	

	strncpy(filename, buf, strlen(buf)>BUF_MAX_LEN ? BUF_MAX_LEN : strlen(buf));
	send(socket_client, filename, strlen(filename), 0); //发送给服务器server

	
	//准备接收从服务器发来的数据
	FILE *fp = fopen(filename, "w");
	if(fp == NULL)
	{
	        printf("File:%s Can Not Open To Write\n", filename);
        	exit(1);
	}


	printf("receive %s ...\n", filename);
	int recv_len = 0;
	while( (recv_len = recv(socket_client, buf, BUF_MAX_LEN, 0)) )
	{
		if(recv_len < 0)
		{
			printf("Recieve Data From Server %s Failed!\n", argv[1]);
            		exit(1);
		}
		int fwrite_len = fwrite(buf, sizeof(char), recv_len, fp);
		if(fwrite_len < recv_len)
		{
			printf("File:%s Write Failed\n", filename);
            		exit(1);
		}
	}
	fclose(fp);
	//printf("Recieve File:\t %s From Server[%s] Finished\n",file_name, argv[1]);
	printf("Receive %s ok .From Server[%s]\n", filename, argv[1]);
	//关闭socket
	close(socket_client);

	return 0;

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值