这段代码完美地发送和恢复了txt文件,但不能像.exe或.img那样执行。请帮我这些,因为我需要使用htonl或htons? 看看!!
这是服务器端recv函数::
if (socket_type != SOCK_DGRAM)
{
fi = fopen (final,"wb");
retval = recv(msgsock, recv_buf, strlen(recv_buf), 0);
/*recv_buf[retval] = '\0';
fprintf (fi,"%s",recv_buf);*/
int i;
i=atoi(recv_buf);
char *q;
q=(char *)malloc(i*sizeof(char));
retval = recv(msgsock, q, strlen(q), 0);
//printf ("%s",q);
fwrite(q,i,1,fi);
fclose(fi);
}
else
{
retval = recvfrom(msgsock,recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&from, &fromlen);
printf("Server: Received datagram from %s\n", inet_ntoa(from.sin_addr));
printf ("SOCK_DGRAM");
}
if (retval == SOCKET_ERROR)
{
fprintf(stderr,"Server: recv() failed: error %d\n", WSAGetLastError());
closesocket(msgsock);
//continue;
}
else
printf("Server: recv() is OK.\n");
if (retval == 0)
{
printf("Server: Client closed connection.\n");
closesocket(msgsock);
//continue;
}
printf("Server: Received %d bytes, data from client\n", retval);
The client side sending function :::
void send_command()
{
int bytesent;
FILE *file_out;
//file_out = fopen(file_path,"rb");
char str_all[100000];//flag [30]="end";
///////////////////////getsize//////////////
char fsize[5];
int filesize;
file_out = fopen(file_path, "rb");
fseek(file_out, 0, SEEK_END);
filesize = ftell(file_out);
rewind (file_out);
itoa (filesize,fsize,10);
/////////////////////////////////////////////
send (ConnectSocket, fsize, strlen (fsize), 0);
char *r = (char *)malloc (filesize * sizeof(char));
fread(r,filesize,1,file_out);
bytesent = send( ConnectSocket, r, strlen(r), 0 );
printf("\nClient: Bytes sent: %ld\n", bytesent);
fclose (file_out);
/*while (fscanf(file_out,"%s",&str_all) != EOF)
{
bytesent = send( ConnectSocket, str_all, strlen(str_all), 0 );
printf("\nClient: Bytes sent: %ld\n", bytesent);
//Sleep(500);
}*/
/*printf("%s",flag);
send( ConnectSocket, flag, strlen(flag), 0 );*/
WSACleanup();
//return 0;
}
答案 0 :(得分:2)
好的,您的计划存在多个问题。
char
的所有可能值都是合法数据值。如果您要发送文本数据,可以说0
表示数据结束,但现在您不能。因此,您必须决定服务器和客户端之间的“协议” - 最简单的是服务器在前4个字节中发送数据的长度(在ntonl()
和ntohl()
上读取如何做到这一点便携))。然后,接收器将确切地知道要读取多少字节。char *recv_buf
,对recv_buf1
也类似。您没有为两个指针中的任何一个分配任何存储空间,因此它们不指向任何有用的位置。然后,您的recv
电话是:recv(msgsock, recv_buf, sizeof(recv_buf), 0);
这也有问题。第一个是上面提到的那个:你没有recv_buf
的存储空间。第二个是,在执行为recv_buf
分配存储之后,您将获取char指针的大小而不是缓冲区recv
指向的长度。解决这两个问题的一种简单方法是将recv_buf
声明为:char recv_buf[SIZE];
,然后在sizeof recv_buf
调用中使用recv()
。我没有看过你的其余代码。您可能需要一个很好的C和网络编程介绍。
答案 1 :(得分:1)
我认为你把C字符串的空终止和套接字上发送的数据包的末尾混淆了。数据包没有“终止”,它只是一串字节。零是完全合法的,你明确地传递(和接收)长度。您当然不需要使用带外设施来接收多个数据包。你能更具体地谈谈你的要求吗?