⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatfile.c

📁 UNIX 网络编程的课程作业 包含多播和广播以及实验报告
💻 C
字号:
#include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h> #include <stdio.h>#include <stdlib.h>#include <string.h> #define HELLO_WORLD_SERVER_PORT 6666#define LENGTH_OF_LISTEN_QUEUE 20#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512int sendfile(int client_socket,char *buffer ){bzero(buffer, BUFFER_SIZE);printf("你好输入传输文件名:");scanf("%s", buffer);char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));if(send(client_socket,buffer,BUFFER_SIZE,0)<0)	{	printf("连接失败!"); 	exit(0);	}FILE * fp = fopen(file_name,"r");if(fp== NULL ){printf("File What You Write:\t%s Can Not Found\n", file_name);}else{bzero(buffer, BUFFER_SIZE);int file_block_length = 0;while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0){printf("file_block_length = %d\n",file_block_length);if(send(client_socket,buffer,file_block_length,0)<0){printf("文件:\t%s 传输失败\n", file_name);exit(1);}bzero(buffer, BUFFER_SIZE);}fclose(fp);printf("文件:\t%s 传输成功\n",file_name);}buffer="/j";send(client_socket,buffer,BUFFER_SIZE,0);return 0;}void getfile(int client_socket,char *buffer){int length = 0;bzero(buffer,BUFFER_SIZE);length = recv(client_socket,buffer,BUFFER_SIZE,0);char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));FILE * fp = fopen(file_name,"w");if(NULL == fp ){printf("文件:\t%s 无法打开!\n", file_name);exit(1);}bzero(buffer,BUFFER_SIZE);length = 0;while( length = recv(client_socket,buffer,BUFFER_SIZE,0)){if(length < 0){printf("从服务器接受数据失败!\n");break;}if(buffer[0]=='/'&&buffer[1]=='j'){	break;}int write_length = fwrite(buffer,sizeof(char),length,fp);fflush(fp);if (write_length<length){printf("文件:\t%s 写入失败\n", file_name);break;}bzero(buffer,BUFFER_SIZE);}close(fp);printf("接受文件:\t %s 失败\n",file_name);}int main(int argc, char **argv){	if (argc != 2)	{		printf("Usage: %s <ConnectIP>or<1-for listen>\n",argv[0]);		exit(1);	}	printf("现在已连接成功请输入/s发送文件\n");	struct sockaddr_in client_addr;	bzero(&client_addr,sizeof(client_addr)); 	client_addr.sin_family = AF_INET;	client_addr.sin_addr.s_addr = htons(INADDR_ANY);	if(atoi(argv[1])==1)	{		client_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);	}	else	client_addr.sin_port = htons(0);	//创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket	int client_socket = socket(PF_INET,SOCK_STREAM,0);	if( client_socket < 0)	{		printf("Create Socket Failed!");		exit(1);	}	if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))	{		printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);		exit(1);	}	struct sockaddr_in client1_addr;	bzero(&client1_addr,sizeof(client1_addr));	client1_addr.sin_family = AF_INET;	socklen_t length = sizeof(client1_addr);	if(atoi(argv[1])==1)	{		if ( listen(client_socket, LENGTH_OF_LISTEN_QUEUE) )		{			printf("Server Listen Failed!");			exit(1);		}		client_socket = accept(client_socket,(struct sockaddr*)&client1_addr,&length);		if ( client_socket< 0)		{			printf("Server Accept Failed!\n");			exit(1);		}		else		{			printf("对方已连接!\n");		}	}	else	{		if(inet_aton(argv[1],&client1_addr.sin_addr) == 0)	{	printf("Server IP Address Error!\n");	exit(1);	}	client1_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);	socklen_t client1_addr_length = sizeof(client1_addr);	if(connect(client_socket,(struct sockaddr*)&client1_addr, client1_addr_length) < 0)	{		printf("Can Not Connect To %s!\n",argv[1]);		exit(1);	}}char buffer[BUFFER_SIZE];bzero(buffer, BUFFER_SIZE);int state=0;while(1){if (fork() == 0)	{		int rstate=0;		while(1)		{			if(rstate==0)			{				if(send(client_socket, (void *)"/0", 1, MSG_OOB) < 0 )        		{                	printf("连接失败!");                	exit(0);        		}			bzero(buffer, BUFFER_SIZE);			length = recv(client_socket,buffer,BUFFER_SIZE,0);			if (length < 0&&client_socket!=0)			{				printf("Server Recieve Data Failed!\n");			}			else			if(buffer[0]=='/'&&buffer[1]=='s') 			{				rstate=1;continue;			}			else			printf("对方信息:%s\n",buffer);			}			else			{					getfile(client_socket,buffer);				rstate=0;continue;			}			}	}while(1){	if(state==0)	{		bzero(buffer, BUFFER_SIZE);		scanf("%s", buffer);		if(buffer[0]=='/'&&buffer[1]=='s')		{			state=1;		}		if(send(client_socket,buffer,BUFFER_SIZE,0)<0)		{			printf("连接失败!"); 			exit(0);		}			}	else	if(state==1)	{		sendfile(client_socket,buffer );		printf("传送文件");		state=0;	}	else	{		printf("接受文件");		bzero(buffer, BUFFER_SIZE);	}	if(state==2)	{		state=0;		break;	}}}close(client_socket);return 0;} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -