我开始学习 socket ,遇到麻烦了!
我做错了什么?

服务器:

/* server.c */

/* ############### INCLUDES ############### */

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

/* ############### DEFINES ############### */

// Check OS
#ifdef OS_WINDOWS
    #define OS 1 // WINDOWS
#else
    #define OS 0 // LINUX || UNIX
#endif

#define MAX_CLIENT 100
#define NAME_SIZE 32
#define BUFFER_SIZE 2048

/* ############### FUNCTIONS PRE-DEFINITIONS ############### */

void error (char *msg);
void clearScreen (void);

/* ############### STRUCTURES ############### */

struct sockaddr_in server_addr;

/* ############### VARIABLES ############### */

int server_accept = 0;
int bytes_read = 0;
char buffer[BUFFER_SIZE] = {0};
char msg[BUFFER_SIZE] = "Hello from server\n";

/* ############### MAIN FUNCTION ############### */

int main (void)
{
    int server_desk = socket(AF_INET, SOCK_STREAM, 0); // Create socket
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(8080);
    server_addr.sin_family = AF_INET;

    clearScreen();

    if (server_desk < 0)
        error("[!] Socket");
    else
        fputs("[*] Socket for server was create.\n" ,stdout);

    if ((bind(server_desk, (struct sockaddr*)&server_addr,
                sizeof(server_addr))) < 0) // Bind socket
        error("[!] Bind");
    else
        fputs("[*] Bind done.\n" ,stdout);

    if ((listen(server_desk, 1)) < 0)
        error("[!] Listen");
    else
        fputs("[*] Listening...\n\n" ,stdout);


    while ((strcmp(buffer, "/shutdown\n")) != 0)
    {
        if ((server_accept = accept(server_desk, NULL, NULL)) < 0)
            error("[!] Accept");
        else
            fputs("[*] Client connected.\n", stdout);

        while(1)
        {
            bytes_read = recv(server_accept, buffer, strlen(buffer), 0);
            if (bytes_read == 0)
            {
                fputs("[*] Client disconected.\n", stdout);
                break;
            }
            else if (bytes_read < 0)
            {
                error("[!] Recv");
            }
            else
            {
                fprintf(stdout, "[Chat] > %s", buffer);
                send(server_accept, msg, strlen(msg), 0);
            }
        }
        close(server_accept);
    }

    return EXIT_SUCCESS;
}

/* ############### FUNCTIONS LOGIC ############### */

void clearScreen (void)
{
    #if (OS == 0)
        system("clear");
    #else
        system("cls");
    #endif

    return;
}

/* error - print error message and exit failure */
void error (char *msg)
{
    perror(msg);
    exit(1);
    return;
}

客户:
/* client.c */

/* ############### INCLUDES ############### */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>

/* ############### DEFINES ############### */

#define BUFFER_SIZE 2048

/* ############### FUNCTIONS PRE-DEFINITIONS ############### */

void error (char *msg);

/* ############### MAIN FUNCTION ############### */

int main (void)
{
    system("clear || cls");
    char msg[BUFFER_SIZE] = {0};
    char buffer[BUFFER_SIZE] = {0};
    int client_desk = 0;
    int client_connect = 0;

    struct sockaddr_in client_addr;
    client_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    client_addr.sin_port = htons(8080);
    client_addr.sin_family = AF_INET;

    client_desk = socket(AF_INET, SOCK_STREAM, 0); // Create socket
    if (client_desk < 0)
        error("[!] Socket");

    client_connect = connect(client_desk, (struct sockaddr*)&client_addr,
                             sizeof(client_addr));
    if (client_connect < 0)
        error("[!] Connect");

    fputs("[Chat] < ", stdout);
    fgets(msg, (sizeof(msg)), stdin);

    send(client_connect, msg, sizeof(msg), 0);
    recv(client_connect, buffer, sizeof(msg), 0);
    fprintf(stdout, "[Chat] > %s", buffer);

    close(client_connect);

    return EXIT_SUCCESS;
}

/* ############### FUNCTIONS LOGIC ############### */

void error (char *msg)
{
    perror(msg);
    exit(1);
    return;
}

我需要向服务器发送消息并获得答案。但是服务器不向客户端发送消息。

而且我不明白如何绑定(bind)服务器的IP地址,例如192.168.0.50:8080

最佳答案

在此处设置客户端地址时:

client_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);

用下面这行替换为服务器的IP地址:
inet_pton(AF_INET, "192.168.0.50", &(client.sin_addr));

这会将addr设置为服务器,以便在连接时将连接到服务器的IP地址而不是INADDR。您已经设置了端口,因此您应该对此感到满意。

基本客户端/服务器的主要结构是服务器绑定(bind)的服务器并接受来自INADDR_ANY的连接,客户端必须使用上述代码片段定义其要连接的IP。

关于c - C socket 故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45021306/

10-13 09:12
查看更多