当前位置: 首页 > 知识库问答 >
问题:

无法通过套接字发送或接收数据

籍英叡
2023-03-14

我试着做一个简单的服务器-客户机套接字通信,但服务器似乎无法正常工作。无论何时发送或接收,我都会收到此错误:

非插座上的插座操作:非插座上的插座操作

奇怪的是,这只会在服务器发送时出现。客户似乎还可以:

//server
#include <iostream>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <arpa/inet.h>

using namespace std;

int main(){
    const int PORT = 5000;
    int serverfd, clientfd, opt=1, n_send, n_recv;
    sockaddr_in server_address, client_address;
    char recvbuf[1024], sendbuf[1024];
    bzero(&server_address , sizeof(server_address));
    inet_pton(AF_INET, "127.0.0.1",&server_address.sin_addr);
    int x = INADDR_ANY;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(PORT);

    socklen_t addrSize = sizeof(server_address);

    if((serverfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
        perror(strerror(errno));
        exit(EXIT_FAILURE);
    }
    if((setsockopt(serverfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) < 0){
        perror(strerror(errno));
        exit(EXIT_FAILURE);
    }
    if((bind(serverfd, (sockaddr*)&server_address, sizeof(server_address)))< 0){
        perror(strerror(errno));
        exit(EXIT_FAILURE);
    }
    if((listen(serverfd, 1))< 0){
        perror(strerror(errno));
        exit(EXIT_FAILURE);
    }
    if((clientfd = accept(serverfd, (sockaddr *)&server_address, (socklen_t*)&addrSize) < 0)){
        perror(strerror(errno));
        exit(EXIT_FAILURE);
    }

    while (true){
        cout << "SAY TO CLIENT: ";
        bzero(sendbuf, sizeof(sendbuf));
        cin >> sendbuf;
        cout << endl;
        send(clientfd, sendbuf, strlen(sendbuf), 0);
        errno = 0;
        bzero(recvbuf, sizeof(recvbuf));
        if((n_recv = recv(clientfd, recvbuf, sizeof(recvbuf), MSG_WAITALL))< 0){
            perror(strerror(errno));
            exit(EXIT_FAILURE);
        }
        cout << recvbuf << endl;
    }

    return 0;
}
//client
#include <iostream>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <arpa/inet.h>

using namespace std;

int main(){
    const int PORT = 5000;
    int sockfd, n_send, n_recv;
    char recvbuf[1024], sendbuf[1024];
    sockaddr_in server_address;
    bzero(&server_address, sizeof(server_address));
    server_address.sin_family= AF_INET;
    server_address.sin_port = htons(PORT);
    inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr);
    if((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
        perror(strerror(errno));
        exit(EXIT_FAILURE);
    }
    if(connect(sockfd, (sockaddr *) &server_address, sizeof(server_address))<0){
        perror(strerror(errno));
        exit(EXIT_FAILURE);
    }
    while (true){
        if((n_recv = recv(sockfd, recvbuf, sizeof(recvbuf), MSG_WAITALL)) < 0){
            perror(strerror(errno));
            exit(EXIT_FAILURE);
        }
        cout << "Server: " << recvbuf << endl;
        cout << "Say to server: ";
        cin >> sendbuf;
        cout << endl;
        if((n_send = send(sockfd, sendbuf, sizeof(sendbuf), 0)) < 0){
            perror(strerror(errno));
            exit(EXIT_FAILURE);
        }
    }
    return 0;
}

共有1个答案

谷梁英资
2023-03-14

clientfd被分配了一个非套接字值。如果我们更改您的If中的空格:

if((clientfd =
     accept(serverfd, (sockaddr *)&server_address, (socklen_t*)&addrSize) < 0
   )) {
        perror(strerror(errno));
        exit(EXIT_FAILURE);
    }

由于您编写它的方式,会检查accept(假定有效的套接字)的结果,并将该结果设置为clientFd。请注意,括号的位置与其他行不匹配。

 类似资料:
  • 我在网上搜索了很多,但是没有找到通过套接字发送对象并按原样接收的解决方案。我知道它需要酸洗,我已经做过了。将其转换为字节,然后从另一方面接收。但如何将这些字节转换为该类型的对象。 这是在客户端将对象转换为StringIO并发送到服务器的代码。在服务器端,我得到字节。现在我正在搜索要再次转换为StringIO的字节,以便获得对象值。 在代码中,对象被包装在StringIO中,并通过套接字发送。任何更

  • 我必须对FTP服务器进行编码,而且我在数据传输方面遇到了问题。 我在linux上使用ftp命令来测试它,我目前正在使用,它发送工作目录中的文件/目录列表。一切正常(ftp打印文件列表),除了ftp打印以下警告: 我想删除该警告,我认为ftp需要二进制数据,但我不知道如何通过套接字发送这样的数据,我目前正在使用最基本的方式发送结果:

  • 问题内容: 我正在尝试开发一个非常简单的客户端/服务器,其中客户端将文件转换为字节,将其发送到服务器,然后将字节转换回文件。 当前,程序仅创建一个空文件。我不是一个出色的Java开发人员,因此不胜感激。 这是接收客户端发送的内容的服务器部分。 这是客户端部分 问题答案: 在Java中复制流的正确方法如下: 希望我每次在论坛上发布时都能获得一美元。

  • 因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如:

  • 问题内容: 您好,我尝试使用Java中的客户端-服务器类发送文件。由于某种原因,当调用发送文件的方法时,套接字关闭。这是代码: 和来自客户端的代码: 和我得到的错误消息:严重:null java.net.SocketException:套接字已关闭 我对此并没有真正的经验,所以如果有帮助的话会很棒。 问题答案: 该方法返回一个,代表它实际读取的字节数。不能保证从字节数组中读取所需的字节数。它通常会

  • 我正试图通过Java的socket发送一个custome对象。我知道我需要将具有我需要发送的对象的类放在相同的包中,具有相同的serialVersionUID并实现Serializable。我已经这样做了,但我仍然不能通过套接字发送对象。我错在哪里了? 以下是客户端代码: 客户端中的类用户 发送user类对象的代码: 这里是服务器的代码: user类的代码:与客户端的user完全相同(我从客户端复