C 了解客户机-服务器连接

C 了解客户机-服务器连接,c,linux,sockets,C,Linux,Sockets,我是套接字编程新手,我正在尝试在linux中使用gcc编译器建立服务器-客户机连接。服务器和客户端,这两个代码在不同的C文件中。我通过用户输入向服务器发送一个字符,服务器增加字符并将其返回给客户端。客户端应保持连接,直到我从用户处获得字符“Q”。我在维护连接时遇到问题。这里我粘贴了客户端代码。当我不使用while循环并且只发送一个字符时,它可以正常工作,但是如果我重复地希望通过相同的连接发送字符,并且只有当用户输入Q时,连接才会关闭。那么,在循环的第一次迭代中,它请求字符,并成功地从服务器获取递

我是套接字编程新手,我正在尝试在linux中使用gcc编译器建立服务器-客户机连接。服务器和客户端,这两个代码在不同的C文件中。我通过用户输入向服务器发送一个字符,服务器增加字符并将其返回给客户端。客户端应保持连接,直到我从用户处获得字符“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;
}

如果不发布后续编辑,就很难准确判断出哪里可能出错

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

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

我必须补充:

    address.sin_port = htons(port);
然后将connect()函数调用移出while循环,确保关闭函数调用仅在从循环中断时进行,即接收q或q

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

这里有一些很好的、容易理解的例子:


消息说明了一切:您正在尝试连接一个已连接的套接字(在第二次和以后的迭代中)。在TCP中,一旦建立连接,它将保持打开状态,直到您手动关闭它。只要将
connect
调用移出
while
循环即可。@szczurcio是的,我尝试将连接置于循环之前,在这种情况下,输出如下。异常终止。输入字符以发送服务器或Q/Q以结束连接:从服务器递增的字符=B输入字符以发送服务器或Q/Q以结束连接:从服务器递增的字符=输入字符以发送服务器或Q/Q以结束连接:K“程序终止
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;
}