C客户端没有从服务器接收
C client doesn't receive from server
我用 select()
做了一个简单的服务器客户端程序,但问题是客户端没有收到欢迎消息。我早些时候在没有 select()
的情况下这样做了几次并且它有效,但突然间它不想在使用 select()
时工作。我做错了什么?
服务器:
#define MAX_CLIENTS 10
int main()
{
system("clear");
printf("***SERVER STARTED***\n");
int master_socket = socket(AF_INET, SOCK_STREAM, 0);
fd_set fdsForReading;
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8888);
bind(master_socket, (struct sockaddr *)&address, sizeof(address));
listen(master_socket, 3);
while (1)
{
FD_ZERO(&fdsForReading); // Clearing the file descriptor set
FD_SET(master_socket, &fdsForReading); // Add master_socket to file descriptor set
printf("Monitoring for connections...\n");
select(master_socket + 1, &fdsForReading, NULL, NULL, NULL);
int accepted_socket = accept(master_socket, (struct sockaddr *)&address, sizeof(address));
printf("[+] New connection accepted\n");
char buffer[125] = "Welcome to my server";
send(accepted_socket, buffer, sizeof(buffer), 0);
printf("End of while loop\n");
}
}
客户:
int main()
{
system("clear");
int clientSocket = socket(AF_INET, SOCK_STREAM, 0), x;
struct sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(8888);
serverAddress.sin_addr.s_addr = INADDR_ANY;
connect(clientSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress));
char serverResponse[125];
recv(clientSocket, &serverResponse, sizeof(serverResponse), 0);
printf("test: %s\n", serverResponse);
scanf("%d", &x);
close(clientSocket);
}
- 您不检查错误。总是这样做!
&serverResponse
应该是 serverResponse
recv
收到的字符数可能少于您发送的字符数,因此您应该检查收到的字符数,并可能将收到的字符连接起来,直到收到完整的消息。
- 您收到的内容通常不会以空字符结尾,因此如果您收到的内容要与
printf("%s", ...
等需要以空字符结尾的字符串的函数一起使用,则需要添加 [=15=]
。在您的情况下,您实际上发送 125
char
s 即使字符串短得多。你可能不应该那样做。这将发送字符串 + 空终止符:
send(accepted_socket, buffer, strlen(buffer) + 1, 0);
accept
的第三个参数应该是 socklen_t *
,而不是 sizeof(address)
。例子:
socklen_t addrlen = sizeof address;
int accepted_socket = accept(master_socket, (struct sockaddr *)&address, &addrlen);
进行这些更改后,如果没有错误发生,客户端将收到很好的问候语 - 但是当您添加错误检查后,您将看到问题出在哪里。
我用 select()
做了一个简单的服务器客户端程序,但问题是客户端没有收到欢迎消息。我早些时候在没有 select()
的情况下这样做了几次并且它有效,但突然间它不想在使用 select()
时工作。我做错了什么?
服务器:
#define MAX_CLIENTS 10
int main()
{
system("clear");
printf("***SERVER STARTED***\n");
int master_socket = socket(AF_INET, SOCK_STREAM, 0);
fd_set fdsForReading;
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8888);
bind(master_socket, (struct sockaddr *)&address, sizeof(address));
listen(master_socket, 3);
while (1)
{
FD_ZERO(&fdsForReading); // Clearing the file descriptor set
FD_SET(master_socket, &fdsForReading); // Add master_socket to file descriptor set
printf("Monitoring for connections...\n");
select(master_socket + 1, &fdsForReading, NULL, NULL, NULL);
int accepted_socket = accept(master_socket, (struct sockaddr *)&address, sizeof(address));
printf("[+] New connection accepted\n");
char buffer[125] = "Welcome to my server";
send(accepted_socket, buffer, sizeof(buffer), 0);
printf("End of while loop\n");
}
}
客户:
int main()
{
system("clear");
int clientSocket = socket(AF_INET, SOCK_STREAM, 0), x;
struct sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(8888);
serverAddress.sin_addr.s_addr = INADDR_ANY;
connect(clientSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress));
char serverResponse[125];
recv(clientSocket, &serverResponse, sizeof(serverResponse), 0);
printf("test: %s\n", serverResponse);
scanf("%d", &x);
close(clientSocket);
}
- 您不检查错误。总是这样做!
&serverResponse
应该是serverResponse
recv
收到的字符数可能少于您发送的字符数,因此您应该检查收到的字符数,并可能将收到的字符连接起来,直到收到完整的消息。- 您收到的内容通常不会以空字符结尾,因此如果您收到的内容要与
printf("%s", ...
等需要以空字符结尾的字符串的函数一起使用,则需要添加[=15=]
。在您的情况下,您实际上发送125
char
s 即使字符串短得多。你可能不应该那样做。这将发送字符串 + 空终止符:send(accepted_socket, buffer, strlen(buffer) + 1, 0);
accept
的第三个参数应该是socklen_t *
,而不是sizeof(address)
。例子:socklen_t addrlen = sizeof address; int accepted_socket = accept(master_socket, (struct sockaddr *)&address, &addrlen);
进行这些更改后,如果没有错误发生,客户端将收到很好的问候语 - 但是当您添加错误检查后,您将看到问题出在哪里。