网络编程,利用回调函数控制进度条

mac2026-05-18  4

sever

#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") #define BUF_SIZE 1024 void ErrorHandling(char *message); int echo_file_open(); typedef void(*CBTest)(void *p); typedef struct cbDemo CBDemo; struct cbDemo { CBTest cb; void *cbParam; int i; }; typedef struct DATA Data; struct DATA { int i; }; void Test(void *p) { int progress=((Data*)p)->i; printf("file opened %d%%\n", progress); } int main(int argc, CHAR* argv[]) { WSADATA wsaData; SOCKET hServSock,hClntSock; char message[BUF_SIZE]; int strLen,i; SOCKADDR_IN servAdr,clntAdr; int clntAdrSize; if(argc!=2) { printf("Usage:%S<port>\n",argv[0]); exit(1); } if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) ErrorHandling("WSAStartup() error!"); hServSock=socket(PF_INET,SOCK_STREAM,0); if(hServSock==INVALID_SOCKET) ErrorHandling("socket() error"); memset (&servAdr,0,sizeof(servAdr)); servAdr.sin_family=AF_INET; servAdr.sin_addr.s_addr=htonl(INADDR_ANY); servAdr.sin_port=htons(atoi(argv[1])); if(bind(hServSock,(SOCKADDR*) &servAdr, sizeof(servAdr))==SOCKET_ERROR) ErrorHandling ("bind() error"); if(listen(hServSock,5)==SOCKET_ERROR) ErrorHandling("listen() error"); clntAdrSize=sizeof(clntAdr); for(i=0;i<5;i++) { hClntSock=accept(hServSock,(SOCKADDR*)&clntAdr,&clntAdrSize); if(hClntSock==-1) ErrorHandling("accept() error"); else printf("Connected client %d\n",i+1); echo_file_open(); while((strLen=recv(hClntSock,message,BUF_SIZE,0))!=0) send(hClntSock,message,strLen,0); closesocket(hClntSock); } closesocket(hServSock); WSACleanup(); system("pause"); return 0; } void RegisterCallback(CBDemo *pDemo,CBTest test,void *p) { pDemo->cb=test;//结构体的cb指向回调函数 pDemo->cbParam=p;//结构体的cbParam指向参数 } int echo_file_open() { FILE *fp; char ch; int i=0; CBDemo demo; Data data; long size; fp=fopen("D:/yao.txt","r"); if (fp==NULL) { printf("FAILURE!\n"); exit(0); } else printf("SUCCESS!\n"); fseek (fp, 0, SEEK_END); ///将文件指针移动文件结尾 size=ftell(fp); printf("%ld\n",size); fseek(fp,0,SEEK_SET); ch=fgetc(fp); while ((ch=fgetc(fp))!=EOF) { i++; data.i=i*100/size; RegisterCallback(&demo,(CBTest)Test,&data); demo.cb(demo.cbParam); //if ((ch=fgetc(fp) == '\n')) //i++; } if(fclose(fp)!=0) printf("not closed!\n"); else printf("closed!\n"); return 0; } void ErrorHandling(char* message) { fputs(message,stderr); fputc('\n',stderr); exit(1); }

client

#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") #define BUF_SIZE 1024 void ErrorHandling(char *message); int main(int argc, CHAR* argv[]) { WSADATA wsaData; SOCKET hSocket; char message[BUF_SIZE]; int str_len,recv_len,recv_cnt; SOCKADDR_IN serv_adr; if(argc!=3) { printf("Usage:%S<IP> <port>\n",argv[0]); exit(1); } if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) ErrorHandling("WSAStart() error!"); hSocket=socket(PF_INET,SOCK_STREAM,0); if(hSocket==INVALID_SOCKET) ErrorHandling("socket() error"); memset(&serv_adr,0,sizeof(serv_adr)); serv_adr.sin_family=AF_INET; serv_adr.sin_addr.s_addr=inet_addr(argv[1]); serv_adr.sin_port=htons(atoi(argv[2])); if(connect(hSocket,(SOCKADDR*)&serv_adr,sizeof(serv_adr))==SOCKET_ERROR) ErrorHandling("connect() error!"); else puts("Connected..."); while (1) { fputs("Input message(Q to quit):",stdout); fgets(message,BUF_SIZE,stdin); if(!strcmp(message,"q\n")||!strcmp(message,"Q\n")) break; str_len=send(hSocket,message,strlen(message),0); recv_len=0; while(recv_len<str_len) { recv_cnt=recv(hSocket,&message[recv_len],BUF_SIZE-1,0); if(recv_cnt==-1) ErrorHandling("read() error!"); recv_len+=recv_cnt; } message[recv_len]=0; printf("Message from server:%s",message); } closesocket(hSocket); WSACleanup(); system("pause"); return 0; } void ErrorHandling(char* message) { fputs(message,stderr); fputc('\n',stderr); exit(1); }
最新回复(0)