【问题标题】:Sendto returning random valuesSendto 返回随机值
【发布时间】:2017-02-07 05:06:59
【问题描述】:

我像这样在我的 udp 套接字客户端调用 sendto:

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

但在服务器端似乎没有收到任何内容,并且以非常奇怪的方式,num_w 在打印出来时给出如下值:

-197379208 -1440076936 2054978424

并且 perror() 显示“成功”

到目前为止的客户端代码:

#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");
        }

提前非常感谢! (哦,我在 Kali linux、虚拟机、Windows 10 上)

【问题讨论】:

    标签: c linux sockets


    【解决方案1】:

    您没有打印num_w。您已将其排除在 printf() 声明之外。您只是打印堆栈中的任何随机垃圾。

    perror() 显示“成功”

    所以num_w 是肯定的。在这种情况下调用perror() 毫无意义。

    【讨论】:

    • 谢谢! num_w 的有趣疏忽.. 除了我的服务器似乎没有收到任何类型的数据,你能看出这可能来自我的客户端程序的原因吗?
    • 首先,servaddr 不包含 IP 地址,只有 INADDR_ANY(全为零),因此您正在广播,这可能不会超出您的本地主机。你还没有绑定list_s,所以很奇怪listen()成功了,包含listen()的程序是服务器,不是客户端。
    • 再次感谢!我知道它通常监听的服务器,监听套接字只是因为它是必需的..现在,我没有对 tcp 套接字做任何事情..我只想让 udp 套接字工作.行:if (inet_aton(argv[2], &servaddr.sin_addr)
    • 是的,我错过了。您必须提供服务器代码。
    猜你喜欢
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2019-04-26
    相关资源
    最近更新 更多