【发布时间】:2021-11-02 13:38:40
【问题描述】:
我很难更改我的服务器发送的数据量并让它发送数据。此代码失败,但当我将 buffer 的大小更改为 16 个字符时有效。
这是来自 transferclient.c 的代码
#include <errno.h>
#include <getopt.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#define BUFSIZE 218
int main(int argc, char **argv) {
unsigned short portno = 10823;
int sock = 0;
struct sockaddr_in serv_addr;
char buffer[32] = {0};
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Socket creation error \n");
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
printf("Attemping to connect\n");
if (connect(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
{
printf("\nConnection Failed \n");
return -1;
}
printf("Connected\n");
read(sock, buffer, 16);
return 0;
}
这是来自 transferserver.c 的代码
#include <errno.h>
#include <getopt.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#define BUFSIZE 218
int main(int argc, char **argv) {
int portno = 10823; /* port to listen on */
int server_fd, new_socket;
struct sockaddr_in address;
int opt =1;
int addrlen = sizeof(address);
// Creating socket file descriptor
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
{
perror("socket failed");
exit(EXIT_FAILURE);
}
// Attaching the socket to the port
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)))
{
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(portno);
// Forcefully attaching socket to the port
if (bind(server_fd, (struct sockaddr *) &address, sizeof(address))<0)
{
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("Listening\n");
while ((new_socket = accept(server_fd, (struct sockaddr *) &address, (socklen_t*) &addrlen)) > 0)
{
printf("%d\n", new_socket);
printf("Socket connected\n");
}
return 0;
}
服务器端
聆听
4
套接字连接
***Client Side***
```
Attemping to connect
Connected
当我将 transferclient.c 中的行更改为 32 字节时。
char buffer[32] = {0};
套接字连接失败。
服务器端
Listening
客户端
Attemping to connect
这是为什么呢?
【问题讨论】:
-
我怀疑问题出在您没有向我们展示的代码中。请提供minimal reproducible example。
-
根据您在问题中发布的输出,
"Connected"和"\nConnection Failed \n"都不会被打印出来。你确定这是正确的吗?如果是这样,您的程序会崩溃吗? -
是的,这是正确的。似乎套接字开始连接并挂起。
-
我建议你把
printf("Connected");改成printf("Connected\n");(加换行符)。或者您应该在该语句之后添加fflush( stdout );。如果您不确定消息是否从输出缓冲区中刷新,那么您可能永远看不到它,例如,如果程序随后进入无限循环。有关更多信息,请参阅this question。另一种方法是使用stderr而不是stdout来获取诊断消息,因为该流通常是无缓冲的。 -
如果您需要调试帮助,minimal reproducible example 是强制性的。