我有一个我需要通过LAN.There发送的文件pict.bmp是一个服务器,它开始侦听port.After客户端与服务器建立连接,它请求服务器提供file.The服务器的文件名,然后使用文件名并发送到client.But。问题是服务器使用sendfile()系统调用成功发送它,但文件没有出现在客户端running.is所在的目录中。有一种更好的方法,即完成相同目的的其他系统调用。我在这里复制粘贴发送接收部分:
服务器:
while(1){
nsd = accept(sd,(struct sockaddr*)&clit,&clen);
if(nsd < 0){
eMsg("Accept error");
}
rc = recv(nsd, filename, sizeof(filename), 0);
if (rc < 0) {
eMsg("Receive error");
}
printf("Filename : %s\n",filename);
filename[strlen(filename) - 1] = '\0';
if (strcmp(filename, "quit") == 0) {
fprintf(stderr, "quit command received, shutting down server\n");
break;
}
fd = open("2bird.bmp", O_RDONLY);
printf("fd is %d\n",fd);
if (fd < 0) {
eMsg("File Open error");
}
offset = 0;
rc = sendfile (nsd, fd, NULL, 1);
if (rc < 0) {
eMsg("File Send error");
fprintf(stderr,"Sending failed");
}
if (rc != stat_buf.st_size) {
eMsg("File Transfer error");
}
close(fd);
close(nsd);客户端:
bzero((char *) &serv_addr, sizeof(serv_addr));
39
40 serv_addr.sin_family = AF_INET;
41
42 bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr,server->h_length);
43
44 serv_addr.sin_port = htons(atoi(argv[2]));
45
46 if (connect(sd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
47
48 eMsg("Connection error");
49
50 }
51
52 printf("Please enter the filename : ");
53
54 bzero(buffer,256);
55
56 fgets(buffer,255,stdin);
57
58 n = write(sd,buffer,strlen(buffer));
59
60 if (n < 0)
61
62 error("Writing To Socket error");
63
64
65 close(sd);
66
67 return 0;
68
69 }
70
71 void eMsg(char *M){
72
73 perror(M);发布于 2012-07-06 17:21:18
正如我所看到的,在服务器上调用sendfile()将数据从fd( bmp文件的文件描述符)复制到nsd(套接字)。因此,您已经将文件内容复制到套接字描述符。但是要在客户端获取此内容,您必须在客户端从该套接字接收数据。
由于您没有这样做,这就是为什么您不能在客户端获取文件。
发布于 2014-03-26 22:21:53
插入例如。
buffer[strcspn(buffer, "\n")] = '\0';
int fd = open(buffer, O_CREAT|O_WRONLY, 0666);
while (n = read(sd, buffer, 256), n > 0) write(fd, buffer, n);
close(fd);在此之前
close(sd);(要添加错误检查)。当然,高阶的缓冲区大小会更有效率。
https://stackoverflow.com/questions/10632919
复制相似问题