David David - 4 years ago 131
C Question

Sendto returning random values

I call sendto in my udp socket client side like this:

if((num_w = sendto(cli_udp_sock, buffer, strlen(buffer), 0, (struct sockaddr *) &servaddr, sizeof(servaddr) )) < 0)


but there seems to be no nothing received at the server side and in very strange fashion, num_w, when printed out, gives values like:

-197379208
-1440076936
2054978424

And perror() displays "success"

Client code up till that point:

#include <sys/socket.h> /* socket definitions */
#include <sys/types.h> /* socket types */
#include <arpa/inet.h> /* inet (3) funtions */
#include <unistd.h> /* misc. UNIX functions */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <netdb.h>
/* Global constants */

#define MAX_LINE (1000)
#define LISTENQ (10)

/* Function declarations */
int ParseCmdLine(int argc, char *argv[], char **szPort, char **szAddress, char ** serv_udp_port);



/* main() */

int main(int argc, char *argv[]) {

//
short int cli_port; /* port number */
short int serv_port;
struct sockaddr_in servaddr; /* socket address structure */
socklen_t serv_addrlen = sizeof(servaddr);
struct sockaddr_in cliaddr;
char buffer[MAX_LINE]; /* character buffer */
char *szAddress; /* Holds remote IP address */
char *szPort; /* Holds remote port */
char *serv_udp_port;
char *endptr; /* for strtol() */
int cli_udp_sock;
/* Get command line arguments */

ParseCmdLine(argc, argv, &szPort, &szAddress, &serv_udp_port);


/* Set the remote port */

cli_port = strtol(szPort, &endptr, 0);
serv_port = strtol(serv_udp_port, &endptr, 0);

if ( *endptr )
{
printf("ECHOCLNT: Invalid port supplied.\n");
exit(EXIT_FAILURE);
}



/* Set all bytes in socket address structure to zero, and fill in the relevant data members */

memset(&cliaddr, 0, sizeof(cliaddr));
cliaddr.sin_family = AF_INET;
cliaddr.sin_port = htons(cli_port);
cliaddr.sin_addr.s_addr = htonl(INADDR_ANY);

memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(serv_port);

/* Set the remote IP address */

if ( inet_aton(argv[2], &servaddr.sin_addr) <= 0 )
{
printf("ECHOCLNT: Invalid remote IP address.\n");
exit(EXIT_FAILURE);
}

int list_s;
if ( (list_s = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
fprintf(stderr, "ECHOCLNT: Error creating listening socket.\n");
exit(EXIT_FAILURE);
}
if (listen(list_s, LISTENQ) < 0)
{
printf("Failed to called listen.\n");
}
if( ((cli_udp_sock = socket(AF_INET, SOCK_DGRAM, 0) )< 0))
{
printf("UDP socket was not successfully created. Exiting...\n");
exit(0);
}

//if(bind(cli_udp_sock, (struct sockaddr *) &cliaddr, sizeof(cliaddr)) > 0);

char command[100];
/* Get command from user */
printf("==============================================\n");

do
{
if(strcmp(command, "s\n") == 0)
{
printf("______________________________________________\n");
printf("'s' entered, \nEnter the string to request\n"); //prompt for string to enter
strcpy(buffer, "CAP\n"); //set first set of characteres to CAP\n
char bucket[100]; //space for entered string
fgets(bucket, sizeof bucket, stdin);
printf("The string entered is: %s", bucket);
strcat(buffer, bucket);

/* Send string to echo server, and retrieve response */
int num_w;
if((num_w = sendto(cli_udp_sock, buffer, strlen(buffer), 0, (struct sockaddr *) &servaddr, sizeof(servaddr) )) < 0)
{
perror("error: ");
printf("Problem writing data to server, errno: %d", errno);
exit(0);
}
else
{
perror("error 2: ");
printf("num_w: %d\n");
}


Thanks so much in advance!
(Oh and I'm on Kali linux, virtual machine, Windows 10)

EJP EJP
Answer Source

You aren't printing num_w. You've left it out of the printf() statement. You're just printing whatever random junk is on the stack.

And perror() displays "success"

So num_w was positive. Calling perror() in that case is pointless.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download