📄 chatfile.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 + -