Server Client程序未定义的行为

时间:2013-09-25 17:08:42

标签: c linux sockets network-programming

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

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

由于我的知识有限,我无法弄清楚这个问题,我们将非常感谢您的帮助。

Server.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 个答案:

答案 0 :(得分:2)

这可能会导致问题。

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

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

AND

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

请参阅Networking and Socket programming tutorial in C

答案 1 :(得分:1)

我认为您需要使用

终止buffer
       buffer[N_from_scanf] = '\0';

发送之前。

答案 2 :(得分:1)

除了一个 MAJOR 之外,accept()函数,你的程序几乎没问题。

  1. accept函数的最后一个参数应该是一个包含结构大小的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数组的末尾添加一个空字符。

  4. 希望这有帮助

答案 3 :(得分:0)

假设您确实在客户端和服务器之间正确连接,那么您可能会遇到如何在client.c和server.c中使用scanf()。您应该使用printf写入stdout。您还可以使用fprintf()将套接字描述符直接传递给函数,而不是使用send()和fscanf与描述符一起接收消息。