- 论坛徽章:
- 0
|
5可用积分
client向server上传文件, 用的循环方法,但是始终只有一个BUFSIZE大小的字符串写入outfile,还请帮忙看看是什么地方不对,还是我对socket理解本身存在问题?
P.s 还有个支持断点续传的要求, 也请各位指点一下思路, 谢谢。
//client.c
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define BUFSIZE 1024
void DieWithError(char *errorMessage);
int main(int argc, char *argv[])
{
int sock;
struct sockaddr_in ServAddr;
unsigned short ServPort;
char *servIP;
char RdBuffer[BUFSIZE];
int i, length, cnt = 0;
FILE *ifp;
if ((argc < 3) || (argc > 4)) {
fprintf(stderr, "Usage: %s <File Name> <Server IP> [<Echo Port>]\n", argv[0]);
exit(1);
}
servIP = argv[2];
if (argc == 4)
ServPort = atoi(argv[3]);
else
ServPort = 3333;
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
DieWithError("socket() failed");
memset(&ServAddr, 0, sizeof(ServAddr));
ServAddr.sin_family = AF_INET;
ServAddr.sin_addr.s_addr = inet_addr(servIP);
ServAddr.sin_port = htons(ServPort);
if (connect(sock, (struct sockaddr *) &ServAddr, sizeof(ServAddr)) < 0)
DieWithError("connect() failed");
if ((ifp = fopen(argv[1], "r")) == NULL)
DieWithError("file open error\n");
fseek(ifp, 0, SEEK_END);
length = ftell(ifp);
fseek(ifp, 0, SEEK_SET);
if ((length % BUFSIZE) == 0)
cnt = length / BUFSIZE;
else
cnt = length / BUFSIZE + 1;
for (i = 0; i < cnt; i++) {
memset(RdBuffer, '\0', BUFSIZE);
fread(RdBuffer, BUFSIZE, 1, ifp);
if (send(sock, RdBuffer, BUFSIZE, 0) < 0)
DieWithError("send() failed");
printf("%s\n", RdBuffer);
}
fclose(ifp);
close(sock);
exit(0);
}
void DieWithError(char *errorMessage) {
perror(errorMessage);
exit(1);
}
//server.c
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAXPENDING 5
#define BUFSIZE 1024
void DieWithError(char *errorMessage);
int main(int argc, char *argv[])
{
int servSock;
int clntSock;
struct sockaddr_in ServAddr;
struct sockaddr_in ClntAddr;
unsigned short ServPort;
unsigned int clntLen;
char WrBuffer[BUFSIZE];
FILE *ofp;
if (argc != 2) {
fprintf(stderr, "Usage: %s <Server Port>\n", argv[0]);
exit(1);
}
ServPort = atoi(argv[1]);
if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
DieWithError("socket() failed");
memset(&ServAddr, 0, sizeof(ServAddr));
ServAddr.sin_family = AF_INET;
ServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
ServAddr.sin_port = htons(ServPort);
if (bind(servSock, (struct sockaddr *) &ServAddr, sizeof(ServAddr)) < 0)
DieWithError("bind() failed");
if (listen(servSock, MAXPENDING) < 0)
DieWithError("listen() failed");
for (; ; ) {
ofp = fopen("outfile", "a");
clntLen = sizeof(ClntAddr);
if ((clntSock = accept(servSock, (struct sockaddr *) &ClntAddr, &clntLen)) < 0)
DieWithError("accept() failed");
printf("Handling client %s\n", inet_ntoa(ClntAddr.sin_addr));
memset(WrBuffer, '\0', BUFSIZE);
if (((recv(clntSock, WrBuffer, BUFSIZE, 0))) < 0)
DieWithError("recv() failed");
if (fwrite(WrBuffer, BUFSIZE, 1, ofp) < 0)
DieWithError("write error\n");
printf("%s\n", WrBuffer);
fclose(ofp);
}
return 0;
}
void DieWithError(char *errorMessage) {
perror(errorMessage);
exit(1);
} |
最佳答案
查看完整内容
if (((recv(clntSock, WrBuffer, BUFSIZE, 0))) < 0) DieWithError("recv() failed"); if (fwrite(WrBuffer, BUFSIZE, 1, ofp) < 0) DieWithError("write error\n"); printf("%s\n", WrBuffer);->while (1){ if (((recv(clntSock, WrBuffer, BUFSIZE, 0))) < 0) {DieWithError("recv() failed");break;} if (fwrite(WrBuffer, BUFSIZE, 1, ofp) < 0) {DieWithEr ...
|