我正在处理客户端必须将文件上载到服务器的二进制文件传输程序。对于这种情况,我需要首先发送文件名,然后再发送文件内容。但这对我来说不可行。使用TCP通过套接字进行二进制文件传输
让我们来看看代码:
// Client-side code to send file name
void sendFileName(
int sd, /*Socket Descriptor*/
char *fname) /*Array Containing the file name */
{
int n , byteswritten=0 , written ;
char buffer[1024];
strcpy(buffer , fname);
n=strlen(buffer);
while (byteswritten<n)
{
written=write(sd , buffer+byteswritten,(n-byteswritten));
byteswritten+=written;
}
printf("File name : %s sent to server \n",buffer);
}
在这段代码中,我通过套接字写入文件名&服务器将读取插槽它的名称如下:
// Server-side code to read file name from client
while ((n = read((int)connfd, (fname + pointer), 1024)) > 0)
{
pointer=pointer+n;
}
好,问题是我必须在发送文件名后在客户端关闭写入端,该文件名将成为服务器端代码的FIN段,以停止从服务器读取数据。
如果我关闭读端,如:
shutdown(sd,SHUT_WR); //Closing write end at client side
我怎么能写通过插座(即发送)的文件内容服务器,以便它可以从套接字读取?
注意:我所做的就是在文件名后添加来自客户端的文件内容,并为内容添加特殊字符(用于通知文件名的末尾),然后添加文件内容。
在客户端,
void readWriteFile(
int sd, /*Socket Descriptor */
int fd, /*File Descriptot */
char *fname) /*File Name */
{
char buffer[1050];
int n;
int len = 0;
char *tmp = (char *)malloc(sizeof (char) * (strlen(fname) + 2));
strcpy(tmp, fname); //Copying the file name with tmp
strcat(tmp, "/"); //Appending '/' to tmp
len = strlen(tmp);
memset(buffer, '\0', sizeof (buffer));
strcpy(buffer, tmp); //Now copying the tmp value to buffer
while ((n = read(fd, buffer + len, 1024)) > 0)
{
if (write(sd, buffer, n) != n)
{
printf("File write Error \n");
exit(0);
}
len = 0;
}
printf("File sent successfully \n");
}
而在服务器端,
char fname[50], buffer[1024];
int n, fd;
int i;
int start = 0;
while ((n = read((int)connfd, buffer, 1024)) > 0) // Reading from socket
{
if (!start)
{
/* This 'if' loop will executed almost once i.e. until
getting the file name */
for (i = 0; i < 1024; i++)
{
/* Since '/' is the termination character for file name */
if (buffer[i] == '/')
{
start = 1; // Got the file name
break;
}
fname[i] = buffer[i]; //Storing the file name in fname
}
fname[i] = '\0';
/* Creating the file in the server side */
fd = open(fname, O_WRONLY | O_CREAT, S_IRWXU);
if (fd < 0)
{
perror("File error");
exit(0);
}
/* Here writing the buffer content to the file after
the (buffer+i+1), because after this address only, we
can get the original file content */
write(fd, buffer + i + 1, n);
}
else
{
write(fd, buffer, n);
}
}
printf("%s received successful \n", fname);
此代码工作正常图像,可执行&文本文件。但是如果我发送任何音频文件,它不会在服务器端播放。尺寸保持不变。但我想知道为什么这会发生在音频文件上。逻辑中有什么错误?我还没有尝试过视频文件。
注意返回值给'written'可能是'在很普通的情况下-l',例如'errno'是'EGAIN'或'EINTR'。这会给你的逻辑带来麻烦。 – 2012-01-11 05:00:31
“但这对我来说不可行。”如果不可行,为什么要问这个问题呢?听起来你已经放弃了。 – 2012-01-11 06:07:04