【发布时间】:2015-05-30 02:25:57
【问题描述】:
将文件内容视为数据流(用户选择缓冲区大小)并通过套接字将其作为 UDP 数据包发送的正确/最简单的方法是什么?然后记录发送的字节数? 解决这个问题的正确方法是什么? 我的 UDP 客户端的当前进度。
#include <stdlib.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>
#define PROTOPORT 33455 //Default Port Number
int main(int argc, char *argv[]) {
char *dHost; //Pointer to Destination IP Address
int port; //Integer to hold Port Number
char *host; //Pointer to Host IP Address
char *inputFile; //Pointer to Input File Name
char *outputFile; //Pointer to Output File Name
int sDescriptor; //Socket Descriptor
struct hostent *ptrh; /* pointer to a host table entry */
struct protoent *ptrp; /* pointer to a protocol table entry */
struct sockaddr_in sad; /* structure to hold an IP address */
dHost = argv[1]; //Server IP Address
host = argv[3]; //Client IP Address
inputFile = argv[4]; //Input File Name
outputFile = argv[5]; //Output File Name
char buffer[atoi(argv[6])]; //Buffer
//Map Port
if (argc > 2) {
port = atoi(argv[2]);
} else {
port = PROTOPORT;
}
if (port > 0)
sad.sin_port = htons((u_short)port);
else {
fprintf(stderr,"bad port number %s\n",argv[2]);
exit(1);
}
//Map IP Address
ptrh = gethostbyname(host);
memcpy(&sad.sin_addr, ptrh->h_addr, ptrh->h_length);
//Create UDP Socket
sDescriptor = socket(PF_INET, SOCK_DGRAM, ptrp->p_proto);
if (sDescriptor < 0) {
fprintf(stderr, "Socket creation failed\n");
exit(1);
}
//Connect
if (connect(sDescriptor, (struct sockaddr *)&sad, sizeof(sad)) < 0) {
fprintf(stderr,"Connect failed\n");
exit(1);
}
//Send
return 0;
}
【问题讨论】:
-
你打电话给
send()和recv().你到底遇到了什么问题? -
@EJP 如何通过发送确定数据包大小?
-
您事先确定数据包大小。分配一个该大小的缓冲区,将一些文件数据读入其中,并将其及其大小传递给
send()(确保您考虑到最后一个缓冲区的字节数可能少于完整缓冲区大小的可能性)。send()传输的 UDP 数据报有效负载将与您指定的缓冲区大小一样大,因此接收方只需查看数据报的大小即可知道缓冲区大小。根据需要重复从头到尾读取整个文件所需的多个缓冲区。 -
@RemyLebeau 这是我的问题。如何分配包含内容的该大小的缓冲区?你能快速指出一个简单的例子吗?
-
@Aaron:认真的吗?你不知道如何分配字节数组,或者从文件中读取?然后你需要停止你正在做的事情并学习如何编写文件 I/O 代码,然后再尝试将它与套接字 I/O 代码混合。
标签: c sockets network-programming