1

我正在 linux 中编写一个服务器客户端聊天程序。由于某种原因,该代码无法按预期工作。

问题出在客户端代码中,在 while 循环内,doesn't wait at scanf用于获取输入的编译器,而不是它sends some garbage data itself to the server,作为回报,服务器也发送了一些数据和client program terminates.

由于我的知识有限,我无法弄清楚问题,您的帮助将不胜感激。

服务器.c

#define PORT 3690

#define MaxBufferLength 1024


int main()
{
    int sockFd, bytesRead, bytesSent;

    char buffer[MaxBufferLength];

    struct sockaddr_in server, client;


    server.sin_port= htons(PORT);
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    sockFd = socket(AF_INET, SOCK_STREAM, 0);


    if(sockFd == -1)
        printf("Unable to open socket\n");


    int i = bind(sockFd, (struct sockaddr *) &server, sizeof(struct sockaddr));

    if(i == -1)
        perror("Unable to bind\n");



    i = listen(sockFd, 1);

    if(i == -1)
        printf("Unable to listen\n");




    int connectionSocket = accept(sockFd, (struct sockaddr *) &client, sizeof(struct sockaddr));

    if(connectionSocket == 1)
        printf("connection established\n");


    while(1)
    {           
        bytesRead = recv(connectionSocket, buffer, MaxBufferLength, 0);

        buffer[bytesRead] = '\0';

        printf("Client said: \n     %s\n", buffer);


        scanf("\n\n = %s", buffer);

        bytesSent = send(connectionSocket, buffer, strlen(buffer), 0);

        if(bytesSent == -1)
            perror("Failed to send a message");

        connectionSocket = accept(sockFd, (struct sockaddr *) &client, sizeof(struct sockaddr)); // wait for connection again
    }


    close(sockFd);

    return 0;



}

问候

4

4 回答 4

2

这可能会导致问题。

sizeof(struct sockaddr) ==>sizeof(struct sockaddr_in) or sizeof(server)

int connection = connect(sockFd, (struct sockaddr *) &server, sizeof(server) )

scanf("Enter message: \n\n = %s", buffer); 
          |
          V 
printf("Enter message: ");
scanf("%s",buffer);   

请参阅C 中的网络和套接字编程教程

于 2013-09-25T17:19:18.287 回答
1

你的程序几乎没问题,除了一个主要的东西,accept()函数。

  1. 接受函数的最后一个参数应该是一个reference to size_t or int包含结构大小的变量,当您将变量数据作为参数传递时。原来这会导致no connection between server and client,这就是你面临这种未定义行为的原因。

  2. 我想你忘记了 scanf 的语法 :)。Don't display message in it for taking input.

  3. 最后一件事是在 char 数组的末尾添加一个空字符。

希望这可以帮助

于 2013-09-25T18:02:28.553 回答
1

我认为你需要终止你buffer

       buffer[N_from_scanf] = '\0';

在你发送之前。

于 2013-09-25T17:17:57.850 回答
0

假设您确实在客户端和服务器之间正确连接,您的问题可能在于您如何在 client.c 和 server.c 中使用 scanf()。您应该使用 printf 写入标准输出。您还可以使用 fprintf() 将套接字描述符直接传递给函数,而不是使用带有描述符的 send() 和 fscanf 来接收消息。

于 2013-09-25T17:31:44.100 回答