我开始学习 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/