gpt4 book ai didi

C socket 麻烦

转载 作者:太空宇宙 更新时间:2023-11-04 04:22:36 29 4
gpt4 key购买 nike

我开始研究套接字,但遇到了麻烦!我做错了什么?

服务器:

/* 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 socket 麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45021306/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com