c++;套接字读取()在连接到服务器时返回-1 我是C++新手,我正在处理socket编程,同时从服务器发送数据到客户端。读()函数在某个时候返回1,在某个时候它返回64并且工作良好。我在下面附上了我的代码,请给我一个更好的解决方案

c++;套接字读取()在连接到服务器时返回-1 我是C++新手,我正在处理socket编程,同时从服务器发送数据到客户端。读()函数在某个时候返回1,在某个时候它返回64并且工作良好。我在下面附上了我的代码,请给我一个更好的解决方案,c++,sockets,C++,Sockets,server.cpp if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { logger("socket failed"); exit(EXIT_FAILURE); } // Forcefully attaching socket to the port 8080 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,

server.cpp

  if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
{
    logger("socket failed");
    exit(EXIT_FAILURE);
}

// Forcefully attaching socket to the port 8080
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
                                              &opt, sizeof(opt)))
{
    logger("setsockopt");
    exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_addr.s_addr = inet_addr("192.168.0.4");
address.sin_port = htons( PORT );


// Forcefully attaching socket to the port 8080
if (bind(server_fd, (struct sockaddr *)&address,
                             sizeof(address))<0)
{
    logger("bind failed");
    exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0)
{
    logger("listen");
    exit(EXIT_FAILURE);
}

 while (true)
 {
                    if ((new_socket = accept(server_fd, (struct sockaddr *)&address,
                                       (socklen_t*)&addrlen))<0)
                    {
                            logger("socket not accept");
                            exit(EXIT_FAILURE);
                    }
                    //valread = read( new_socket , buffer, 1024);
                    //printf("%s\n",buffer );
                    send(new_socket , hash_key , strlen(hash_key) , 0 );
                    //printf("Hello message sent\n");
   }
return 0;
if((服务器fd=socket(AF\u INET,SOCK\u STREAM,0))==0)
{
记录器(“套接字失败”);
退出(退出失败);
}
//将插座强制连接至端口8080
if(setsockopt)(服务器fd、SOL_套接字、SO_REUSEADDR | SO_REUSEPORT、,
&opt,sizeof(opt)))
{
记录器(“setsockopt”);
退出(退出失败);
}
address.sin_family=AF_INET;
address.sin_addr.s_addr=INADDR\u ANY;
address.sin_addr.s_addr=inet_addr(“192.168.0.4”);
address.sin_port=htons(port);
//将插座强制连接至端口8080
if(bind(server_fd,(struct sockaddr*)和address,

sizeof(address))您侦听来自客户端的传入连接,并在服务器端的同一个循环中将数据发送给客户端。
您应该使用线程将它们分开。您的服务器代码在接受例程上阻塞。

您侦听来自客户端的传入连接,并在服务器端的同一个循环中将数据发送到客户端。
您应该使用线程将它们分开。您的服务器代码在接受例程上阻塞。

请参阅
man 2 read
。将
errno
设置为什么?您应该执行
if(valread==-1)perror(“read”);
打印出实际发生的错误。您可以看一下。在这个程序中,我实现了接受器/连接器反应器/前置器/动作模式。问题可能是您可以接受很多连接。您需要正确处理返回的fd。存储在向量或某处。很抱歉,但不是那么容易…请参阅
man 2读取。
errno
设置为什么?如果(valread==-1)perror(“读取”),则应执行
打印出实际发生的错误。您可以看一下。在这个程序中,我实现了接受器/连接器反应器/前置器/动作模式。问题可能是您可以接受很多连接。您需要正确处理返回的fd。存储在向量或某物中。抱歉,但不是那么容易…请避免使用tel他们应该将最小示例代码分解为多个线程。这会使出现的问题过于复杂,并不总是一个好的设计路径。这里的问题在于使用
connect
,除了
EINPROGRESS
之外,它可能会因代码未处理的原因或在处理返回fr时失败om
阅读
。请避免告诉人们他们应该将最小示例代码分解为多个线程。这会使出现的问题过于复杂,并不总是一个好的设计路径。这里的问题是使用
连接
,除了
EINPROGRESS
未处理的原因之外,它可能会失败处理从
读取的返回时的代码或。
                 arg |= O_NONBLOCK;
                  if( fcntl(sock, F_SETFL, arg) < 0) {
                     fprintf(stderr, "Error fcntl(..., F_SETFL) (%s)\n", strerror(errno));
                     exit(0);
                  }
                   int res;
                   res = connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
                  if (res < 0) {
                     if (errno == EINPROGRESS) {
                        fprintf(stderr, "EINPROGRESS in connect() - selecting\n");
                        do {
                           tv.tv_sec = 50;
                           tv.tv_usec = 0;
                           FD_ZERO(&myset);
                           FD_SET(sock, &myset);
                           res = select(sock+1, NULL, &myset, NULL, &tv);
                           if (res < 0 && errno != EINTR) {
                              fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno));
                              exit(0);
                           }
                           else if (res > 0) {
                              // Socket selected for write
                              lon = sizeof(int);
                              if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*)(&valopt), &lon) < 0) {
                                 fprintf(stderr, "Error in getsockopt() %d - %s\n", errno, strerror(errno));
                                 exit(0);
                              }
                              // Check the value returned...
                              if (valopt) {
                                 fprintf(stderr, "Error in delayed connection() %d - %s\n", valopt, strerror(valopt)
                );
                                 exit(0);
                              }
                              break;
                           }
                           else {
                              fprintf(stderr, "Timeout in select() - Cancelling!\n");
                              exit(0);
                           }
                        } while (1);
                     }
                     else {
                        fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno));
                        exit(0);
                     }
                     valread = read( sock , buffer, 1024);
                    cout<<valread<<endl;