使用TCP套接字向服务器发送消息时出现问题

x0fgdtte  于 2023-02-18  发布在  其他
关注(0)|答案(1)|浏览(144)

我尝试向服务器发送消息,但当我连接时,服务器立即无法接收消息,似乎服务器“不等待”用户输入消息,服务器应该一直处于while循环中,永远等待客户端并打印它们的消息。
我不知道出了什么问题。
服务器代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>

#define PORT 4000
#define WORD_SIZE 256
#define USER_SOCKETS 2
#define MAX_USERS 10

int receiveMessage(int socket, char message[])
{
    int bytesReceived;
    while (1)
    {
        bytesReceived = recv(socket, message, WORD_SIZE, 0);
        if (bytesReceived < 0)
            return -1;

        if (bytesReceived == 0)
            return 0;

    }
}

int main(int argc, char *argv[])
{
    int serverSockfd;
    socklen_t clilen;
    struct sockaddr_in serv_addr, cli_addr;

    if ((serverSockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        printf("Error creating the socket.\n");

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    bzero(&(serv_addr.sin_zero), 8);

    if (bind(serverSockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
        printf("Error binding the socket..\n");
        return -1;
    }

    if (listen(serverSockfd, 5) < 0)
    {
        printf("Error on listening.\n");
        return -1;
    }

    int newSockfd;
    while (1) 
    {
        if (newSockfd = accept(serverSockfd, (struct sockaddr *)&cli_addr, &clilen) < 0)
        {
            printf("Error on accept a new client.\n");
            continue;
        }

        char username[WORD_SIZE];
        if (receiveMessage(newSockfd, username) < 0)
        {
            printf("Error receiving message.\n");
            close(newSockfd);
        }

        printf("Message: %s\n", username);
        close(newSockfd);
    }

    return 0;
}

客户代码:

#include <stdio.h>
#include <stdlib.h>    
#include <unistd.h>    
#include <string.h>   
#include <sys/types.h>    
#include <sys/socket.h>  
#include <netinet/in.h> 
#include <netdb.h>

#define PORT 4000

int main(int argc, char * argv[]) {
    int sockfd, n;
    struct sockaddr_in serv_addr;
    struct hostent * server;

    char buffer[256];
    if (argc < 2) {
        fprintf(stderr, "usage %s hostname\n", argv[0]);
        exit(0);
    }

    server = gethostbyname(argv[1]);
    if (server == NULL) {
        fprintf(stderr, "ERROR, no such host\n");
        exit(0);
    }

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
        printf("ERROR opening socket\n");

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    serv_addr.sin_addr = * ((struct in_addr * ) server -> h_addr);
    bzero( & (serv_addr.sin_zero), 8);

    if (connect(sockfd, (struct sockaddr * ) & serv_addr, sizeof(serv_addr)) < 0)
        printf("ERROR connecting\n");

    printf("Enter the message: ");
    bzero(buffer, 256);
    fgets(buffer, 256, stdin);

    /* write in the socket */
    n = write(sockfd, buffer, strlen(buffer));
    if (n < 0)
        printf("ERROR writing to socket\n");

    bzero(buffer, 256);

    printf("%s\n", buffer);

    close(sockfd);
    return 0;
}
mnemlml8

mnemlml81#

该行:

if (newSockfd = accept(serverSockfd, (struct sockaddr *)&cli_addr, &clilen) < 0)

如果accept()成功,则将newSockfd设置为0,而不是设置为套接字的描述符。这是因为<=具有更高的优先级,因此编译器的行为就像您编写以下代码一样:

if (newSockfd = (accept(serverSockfd, (struct sockaddr *)&cli_addr, &clilen) < 0))

您需要改为这样写:

if ((newSockfd = accept(serverSockfd, (struct sockaddr *)&cli_addr, &clilen)) < 0)

相关问题