【发布时间】:2017-07-07 02:39:17
【问题描述】:
我们正在尝试应用基于 UDP 的协议,但 sendto() 函数存在一些问题。
当我们尝试使用 ack 响应写入请求时,我们从 sendto() 函数中得到“无效参数”
这是我们的代码:
int sock; // Socket
sockaddr_in_t echoServAddr; // Local address
sockaddr_in_t echoClntAddr; // Client address
unsigned int cliAddrLen; // Length of incoming message
data_packet_t echoBuffer;
wrq_packet_t wrqBuffer;
unsigned short echoServPort; // Server port
int recvMsgSize; // Size of received message
ack_packet_t Ack;
struct timeval timeout;
fd_set fds;
/* Create socket for sending/receiving datagrams */
if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) perror("TTFTPERROR: socket() failed");
/* Construct local address structure */
memset(&echoServAddr, 0, sizeof(echoServAddr));
echoServAddr.sin_family = AF_INET;
echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
echoServAddr.sin_port = htons(echoServPort);
/*Bind to the local address */
if (bind(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) perror("TTFTPERROR: bind() failed");
FD_ZERO(&fds);
FD_SET(sock, &fds);
timeout.tv_sec = WAIT_FOR_PACKET_TIMEOUT;
timeout.tv_usec = 0;
while (1) {
recvMsgSize = recvfrom(sock, &wrqBuffer, FULL_PACKET_SIZE, 0, (struct sockaddr *) &echoClntAddr, &cliAddrLen);
if (recvMsgSize > 0) break; // we got something!
}
Ack = CreateAckPacket(0); // send ack 0
if (sendto(sock, &Ack, sizeof(Ack), 0, (struct sockaddr *) &echoClntAddr, sizeof(echoClntAddr)) == -1){
perror("TTFTPERROR: sendto() failed to send ack 0");
exit(-1);
}
您能帮助我们了解问题所在吗?
【问题讨论】:
-
错误/错误代码是什么?
-
22,错误是“无效参数”
-
@szczurcio:那将是编译器错误,而不是运行时错误。但是我知道的
sendto()将const void *作为第二个参数。 -
@MartinR 我认为 OP 意味着编译器错误,我想应该在问题中澄清。好吧,这取决于环境,Windows API 采用
const char*: msdn.microsoft.com/en-us/library/windows/desktop/… -
@user3350919 您正在使用
-Wall进行编译,对吗?这至少应该给你一个警告。