本文共 3434 字,大约阅读时间需要 11 分钟。
将以前一篇Demo调整下格式, 另外此代码不完善, 仅做网络通讯API测试Demo, 客户端接收数据有BUG,可能因为发送端发送太快, 以及接收端接收字节数量不对引起。
另外发现同一机器做测试Socket通讯数据为内存拷贝, 会导致原发送的文件大小有变化,变化数量跟实际发送的数据大小有关。#include#include #include #include #include #include #include #define BUFF_SIZE 100int main(int argv,char *args[]){ int servsock; struct sockaddr_in servaddr; if(argv!=3){ printf("Usage:%s \n",args[0]); exit(1); } servsock = socket(PF_INET,SOCK_STREAM,0); if(servsock == -1) { printf("socket() error\n"); exit(1); } memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr(args[1]); servaddr.sin_port = htons(atoi(args[2])); if(connect(servsock,(struct sockaddr*)&servaddr,sizeof(servaddr)) ==-1) { printf("connect() error. %s:%s\n", args[1], args[2]); exit(1); }else{ printf("connected.....%s:%s\n", args[1], args[2]); } printf("please input filename:"); char filename[BUFF_SIZE]; memset(filename,0,sizeof(char)*BUFF_SIZE); scanf("%s",filename); write(servsock,filename,strlen(filename)); int successFlag; read(servsock,&successFlag,sizeof(successFlag)); if(successFlag!=1){ printf("input file is not existed!\n successFlag is %d\n",successFlag); exit(1); }else{ FILE *fp = fopen(filename,"w"); while(1){ memset(filename,0,BUFF_SIZE); int revlen = read(servsock,filename,BUFF_SIZE); if(revlen ==0) break; fputs(filename,fp); } fclose(fp); printf("complete!\n"); } close(servsock); return 0;}
#include#include #include #include #include #include #include #define MAX_SEND_LENGTH 65536int main(int argv,char *args[]){ int servsock,clntsock; struct sockaddr_in servaddr,clntaddr; if(argv!=2){ printf("Usage:%s \n", args[0]); exit(1); } servsock = socket(PF_INET,SOCK_STREAM,0); memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(atoi(args[1])); if(bind(servsock,(struct sockaddr*)&servaddr,sizeof(servaddr)) ==-1) { printf("bind() error\n"); exit(1); } if(listen(servsock,5) ==-1) { printf("listen() error %s\n", args[1]); exit(1); } else { printf("socket listen to %s\n", args[1]); } socklen_t len = sizeof(clntaddr); clntsock = accept(servsock, (struct sockaddr*)&clntaddr, &len); char filename[100]; memset(filename, 0, 100); read(clntsock, filename, 100); printf("receiver filename is: %s\n",filename); FILE *fp = fopen(filename, "r+b"); int successFlag = 1; if(!fp) { successFlag = 0; write(clntsock, &successFlag, sizeof(successFlag)); printf("NULL\n"); close(clntsock); close(servsock); return 0; } write(clntsock, &successFlag, sizeof(successFlag)); fseek(fp, 0, SEEK_END); uint32_t uDataLen = ftell(fp); fseek(fp, 0, SEEK_SET); printf("will be send data: %s, len = %u Byte\n", filename, uDataLen); uint8_t * ptempFileData = new uint8_t[uDataLen]; uint8_t * pSendBuffer = new uint8_t[uDataLen]; fread(ptempFileData, 1, uDataLen, fp); memcpy(pSendBuffer, ptempFileData, uDataLen); delete ptempFileData; uint32_t cursor = 0; while(cursor < uDataLen) { uint32_t sendLen = uDataLen - cursor; if(sendLen > MAX_SEND_LENGTH) sendLen = MAX_SEND_LENGTH; cursor += sendLen; write(clntsock, pSendBuffer + cursor, sendLen); printf("sent length: %d Byte\n", cursor); } printf("sent complete: %d Byte\n", uDataLen); fclose(fp); delete pSendBuffer; close(clntsock); close(servsock); return 0;}
转载地址:http://frhji.baihongyu.com/