#include myhead.h #define SER_IP 192.168.125.78 #define SER_PORT 69 #define CLI_IP 192.168.125.176 #define CLI_PORT 4399 //文件上传 void upload(int cfd,struct sockaddr_in sin)//服务器信息结构体传参 { //填充读写请求字符数组--操作码文件名0模式0 char path[128]; printf(请输入要上传的文件路径:); fgets(path,sizeof(path),stdin); path[strlen(path)-1]0; char data[516]; short* code(short*)data; *codehtons(2); char* pathnamedata2; strcpy(pathname,path); char* modepathnamestrlen(pathname)1; strcpy(mode,octet); int size4strlen(pathname)strlen(mode); //向服务器发送下载请求 if(sendto(cfd,data,size,0,(struct sockaddr*)sin,sizeof(sin))-1) { perror(sendto error); return; } socklen_t socklensizeof(sin);//接受服务器信息结构体容器 int fdopen(path,O_RDONLY); if(fd-1) { perror(open error); return; } int hblock1;//数据包块编码号从1开始 while(1) { memset(data,0,516); //接收应答包 if(recvfrom(cfd,data,516,0,(struct sockaddr*)sin,socklen)-1) { perror(recvfrom error); return; } int resread(fd,data4,516-4); short *p1(short*)data; *p1htons(3); *(p11)htons(hblock); //发送数据包 if(sendto(cfd,data,res4,0,(struct sockaddr*)sin,sizeof(sin))-1) { perror(sendto error); return; } if(res0) { printf(上传完毕\n); break; } } close(fd); } //文件下载 void download(int cfd,struct sockaddr_in sin) { //填充读写请求字符数组--操作码文件名0模式0 char filename[32]; printf(请输入要下载的文件名:); fgets(filename,sizeof(filename),stdin); filename[strlen(filename)-1]0; char data[516]; short *code(short*)data; *codehtons(1); char* filedata2; strcpy(file,filename); char* modefilestrlen(file)1; strcpy(mode,octet); int size4strlen(file)strlen(mode); if(sendto(cfd,data,size,0,(struct sockaddr*)sin,sizeof(sin))-1) { perror(sendto error); return; } socklen_t socklensizeof(sin); int fdopen(filename,O_CREAT|O_WRONLY,0664); while(1) { memset(data,0,516); //接收数据包 int lenrecvfrom(cfd,data,516,0,(struct sockaddr*)sin,socklen); if(len-1) { perror(recvfrom error); return; } write(fd,data4,len-4); if(len516) { printf(下载完毕\n); break; } short *p1(short*)data; *p1htons(4); //发送应答包 if(sendto(cfd,data,4,0,(struct sockaddr*)sin,sizeof(sin))-1) { perror(sendto perror); return; } } close(fd); } int main(int argc, const char *argv[]) { //创建客服端套接字 int cfdsocket(AF_INET,SOCK_DGRAM,0); if(cfd-1) { perror(socket error); return -1; } printf(socket success cfd%d\n,cfd); //填充客户端信息结构体绑定 struct sockaddr_in cin; cin.sin_familyAF_INET; cin.sin_porthtons(CLI_PORT); cin.sin_addr.s_addrinet_addr(CLI_IP); if(bind(cfd,(struct sockaddr*)cin,sizeof(cin))-1) { perror(bind error); return -1; } printf(bind success\n); //填充服务器信息结构体 struct sockaddr_in sin; sin.sin_familyAF_INET; sin.sin_porthtons(SER_PORT); sin.sin_addr.s_addrinet_addr(SER_IP); int ch; while(1) { printf(请选择要操作的选项:\n); printf(1.上传\n); printf(2.下载\n); printf(3.退出\n); scanf(%d,ch); while(getchar()!10); switch(ch) { case 1: upload(cfd,sin); break; case 2: download(cfd,sin); break; case 3: return 1; default: printf(输入错误请重新输入\n); break; } } close(cfd); return 0; }2.tcp多进程多线程实现并发服务器3. 流式域套接字、报式域套接字实现同一主机之间通信