繁体   English   中英

Linux套接字程序只是冻结而没有错误

[英]Linux socket program just freezes without error

我最近使用Windows进行套接字编程,但是我的作业要求学生使用Linux套接字标头(sys / socket.h)而不是Windows。 因此,我从零开始,但是程序冻结了,即使它是一个非常简单的程序,它什么也不做,只在建立连接时才打印一条消息。

Server.cpp

#include <sys/socket.h>
#include <cstdio>
#include <stdlib.h>
#include <cstring>
#include <errno.h>
#include <string>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define PORT 3490
#define BACKLOG 10

int main(void){
    int sockfd, new_fd;
    struct sockaddr_in my_addr;
    struct sockaddr_in their_addr;
    socklen_t sin_size;
    if((sockfd = socket(PF_INET, SOCK_STREAM, 0))==-1){
        perror("Socket creation failed");
        exit(1);
    }
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(PORT);
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr))==-1){
        perror("Socket binding failed");
        exit(1);
    }
    if(listen(sockfd, BACKLOG) == -1){
        perror("Socket listening failed");
        exit(1);
    }
    sin_size = (socklen_t)sizeof(struct sockaddr_in);
    while(true){
        printf("Loop Test"); // This is not displayed at all
        if((new_fd = accept(sockfd, (struct sockaddr*)&their_addr, &sin_size))==-1){
            perror("Connetion accepting failed");
            exit(1);
        }
        printf("Server got connection from %s\n", inet_ntoa(their_addr.sin_addr));
    }
    return 0;
}

Client.cpp

#include <sys/socket.h>
#include <cstdio>
#include <stdlib.h>
#include <cstring>
#include <errno.h>
#include <string>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define PORT 3490

int main(void){
    int sockfd;
    struct sockaddr_in their_addr;
    if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1){
        perror("Socket generating failed");
        exit(1);
    }
    their_addr.sin_family = AF_INET;
    their_addr.sin_port = htons(PORT);
    their_addr.sin_addr.s_addr = INADDR_LOOPBACK;
    if(connect(sockfd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr)) == -1){
        perror("Connection failed");
        exit(1);
    }
    printf("Loop test"); // This is not displayed no matter if server is on or not
    return 0;
}

正如我在代码中提到的那样,它只是停止并且不会显示perror和printf(用于调试)。 为什么会这样呢? (我正在使用Ubuntu)

您的程序有两个问题。 第一个相对较小,这是您不以"\\n"结尾您的printf语句。 因此,输出将被缓冲,您不会立即看到它。

但是,如果您没有一个简单而烦人的错误,那么仅凭此将是不可见的(尽管它确实使调试变得更加困难),如果您没有一个简单但令人讨厌的错误-您将无法通过htonl将INADDR_LOOPBACK转换为big endian。 具有讽刺意味的是,您可以对INADDR_ANY执行此操作(尽管良好的风格并不能真正完成任何操作,因为0始终为0),但是请不要在真正重要的地方使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM