了解客户端 - 服务器连接

时间:2015-05-30 20:21:08

标签: c linux sockets

我是套接字编程的新手,我试图在linux中使用gcc编译器建立服务器 - 客户端连接。服务器和客户端,两个代码都在不同的C文件中。我通过用户输入向服务器发送一个字符,服务器递增字符并将其返回给客户端。客户端应保持连接直到我得到字符&# 39; Q'来自用户。我在维护连接方面遇到了麻烦。在这里我粘贴了客户端代码。当我不使用while循环并且只发送一个字符但是如果我反复想要通过同一连接发送字符时,它工作正常,并且连接只会在用户关闭时关闭进入Q.好吧,在循环的第一次迭代中它要求字符并成功从服务器获取递增的字符,但第二次它说"传输端点已经连接"。请帮助我理解这一点。

int main(int argc, char *argv[])
{
    int sockfd;
    int len, port;
    struct sockaddr_in address;
    int result;
    char ch;
    port = atoi(argv[1]);

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("127.0.0.1");
    address.sin_port = port;
    len = sizeof(address);


    while (1){

        printf("Enter Character To Send The Server OR Q/q To End The  Connection:");
        scanf("%c", &ch);
        fflush(stdin);

        if (connect(sockfd, (struct sockaddr *)&address, len) == -1) {
            perror("oops: client failed to connect");
            return 1;
        }
        if (ch == 'Q' || ch == 'q'){
            printf("Connection Closed");
            break;
        }

        write(sockfd, &ch, 1);
        read(sockfd, &ch, 1);
        printf("Incremented character from server = %c\n", ch);

    } close(sockfd);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果没有发布后续修改,很难确切地说出错误的位置。

由于括号的放置(作为while循环块定义的一部分),您可能会意外关闭文件描述符?

在您的情况下,您只需要调用 connect()一次。 以下代码对我来说很好(我的服务器代码只是将客户端收到的字符写回给它,客户端按预期接收/打印它)。

我不得不补充道:

    address.sin_port = htons(port);

然后将 connect()函数调用移出while循环,确保仅在断开循环时才接收 close 函数调用,即接收 q Q

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

    int sockfd;
    int len, port;
    struct sockaddr_in address;
    int result;
    char ch;
    port = atoi(argv[1]);

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("127.0.0.1");
    address.sin_port = htons(port);
    len = sizeof(address);

    if (connect(sockfd, (struct sockaddr *)&address, len) == -1) {
            perror("oops: client failed to connect");
            return 1;
        }

    while(1)
    {
        printf("Enter Character To Send The Server OR Q/q To End The Connection:");
        scanf("%c", &ch);
        fflush(stdin);

        if (ch == 'Q' || ch == 'q'){
            printf("Connection Closed");
            break;
        }

        write(sockfd, &ch, 1);
        read(sockfd, &ch, 1);
        printf("Incremented character from server = %c\n", ch);
    }

    close(sockfd);
    return 0;
}

如果您仍然遇到问题,那么您的服务器代码中可能会发生一些奇怪的事情。您是否意外断开了客户端的连接?

这里有一些很好的,易于理解的例子:

http://www.thegeekstuff.com/2011/12/c-socket-programming