Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将getaddrinfo()添加到UDP客户端会导致其失败_C_Sockets - Fatal编程技术网

C 将getaddrinfo()添加到UDP客户端会导致其失败

C 将getaddrinfo()添加到UDP客户端会导致其失败,c,sockets,C,Sockets,我是C级新手。我正在使用中的代码编写一个简单的UDP echo服务器和客户端 它工作得很好。但是,我决定添加动态解析服务器名称并在用户指定端口上打开的代码。我的客户似乎在等待gets()请求。我做错了什么?除了硬编码的IP和端口号外,原始客户端工作正常 有关守则如下: int main(int argc, char *argv[]) { int sockfd, rv, i; char buf[BUFLEN]; char message[BUFLEN]; struct addrinfo hints

我是C级新手。我正在使用中的代码编写一个简单的UDP echo服务器和客户端

它工作得很好。但是,我决定添加动态解析服务器名称并在用户指定端口上打开的代码。我的客户似乎在等待gets()请求。我做错了什么?除了硬编码的IP和端口号外,原始客户端工作正常

有关守则如下:

int main(int argc, char *argv[]) {
int sockfd, rv, i;
char buf[BUFLEN];
char message[BUFLEN];
struct addrinfo hints, *servinfo, *p;
socklen_t fromlen;

if (argc != 3) {
    fprintf(stderr, "usage: %s hostname port\n", argv[0]);
    exit(1);
}

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;

if ((rv = getaddrinfo(argv[1], argv[2], &hints, &servinfo)) != 0) {
    die("getaddrinfo");
}

// loop through all the results and connect to the first we can
for (p = servinfo; p != NULL; p = p->ai_next) {
    if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
        perror("client: socket");
        continue;
    }
    break;
}

if (p == NULL)
        die("client: failed to connect");

while (1) {
    printf("Enter message : ");
    gets(message);

    //send the message
    if (sendto(sockfd, message, strlen(message), 0, p->ai_addr, p->ai_addrlen) == -1)
        die("sendto()");        

    //receive a reply and print it
    //clear the buffer by filling null, it might have previously received data
    memset(buf, '\0', BUFLEN);

    fromlen = p->ai_addrlen;
    printf("Size is %d", fromlen);
    //try to receive some data, this is a blocking call
    if (recvfrom(sockfd, buf, BUFLEN, 0, p->ai_addr, &fromlen) == -1)
        die("recvfrom()");      

    puts(buf);
}

close(sockfd);
return 0;
工作的代码如下所示。它使用相同的gets()调用


}

在它说:
输入消息:
之后,您要输入什么
gets()
是一个阻塞函数…”“似乎挂起了gets()请求。”:调试器会说什么?只是普通文本后跟一个enter@alk当前位置它不会压碎。我输入文本,点击回车,提示符转到新行,等待我输入更多文本。您可能想学习如何使用调试器并跟踪代码。为此,使用gcc的符号
-g
进行编译,然后使用gdb启动程序,如
gdb--args
int main(void)
{
    struct sockaddr_in si_other;
    int s, i, slen=sizeof(si_other);
    char buf[BUFLEN];
    char message[BUFLEN];


if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
{
    die("socket");
}

memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(PORT);

if (inet_aton(SERVER , &si_other.sin_addr) == 0)
{
    fprintf(stderr, "inet_aton() failed\n");
    exit(1);
}

while(1)
{
    printf("Enter message : ");
    gets(message);

    //send the message
    if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen)==-1)
    {
        die("sendto()");
    }

    //receive a reply and print it
    //clear the buffer by filling null, it might have previously received data
    memset(buf,'\0', BUFLEN);
    //try to receive some data, this is a blocking call
    if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == -1)
    {
        die("recvfrom()");
    }

    puts(buf);
}

close(s);
return 0;