繁体   English   中英

BSD Sockets - 使用发送和接收

[英]BSD Sockets - Using send and recv

我正在尝试使用 bsd sockets 在 linux 中实现一个简单的聊天程序。 现在我只是想从客户端向服务器发送和接收一条消息。 每当我运行代码时,recv 返回 -1 并且 errno 代码为 22。

服务器代码 -

struct sockaddr name;
char buf[80];

int main(int agrc, char** argv) {

    int sock, new_sd;   //sock is this socket, new_sd is connection socket
    int adrlen, cnt;

    name.sa_family = AF_UNIX;
    strcpy(name.sa_data, "/tmp/servsock");
    adrlen = strlen(name.sa_data) + sizeof(name.sa_family);

    sock = socket(AF_UNIX, SOCK_STREAM, 0);

    if (sock < 0) {
        cout<<"\nserver socket failure "<<errno;
        cout<<"\nServer: ";
        exit(1);
    }

    unlink("/tmp/servsock");
    if(bind (sock, &name, adrlen) < 0)
        cout<<"\nBind failure "<<errno;

    if(listen(sock, 5) < 0)
        cout<<"\nlisten error "<<errno;

    while(1) {
        if( new_sd = accept(sock, &name, (socklen_t*)&adrlen) < 0) {
            cout<<"\nserver accept failure "<<errno;
            exit(1);
        }

        char* buf = new char[14];

        if(recv(sock, buf, 14, 0) < 0) {
            cout<<"\nError receiving data "<<errno;
            exit(1);
        }
    }   //end while
    return 0;
}

客户端代码 -

struct sockaddr name;

int main(int agrc, char** argv) {

    int sock, new_sd, adrlen, cnt;
    sock = socket(AF_UNIX, SOCK_STREAM, 0);

    if (sock < 0) {
        cout<<"\nserver socket failure "<<errno;
        cout<<"\nServer: ";
        exit(1);
    }

    //stuff for server socket
    name.sa_family = AF_UNIX;
    strcpy(name.sa_data, "/tmp/servsock");
    adrlen = strlen(name.sa_data) + sizeof(name.sa_family);

    if(connect(sock, &name, adrlen) < 0) {
        cout<<"\nclient connection failure "<<errno;
        exit(1);
    }

    cout<<"\nSuccessful connection from client 1";

    std::string buf = "\nClient 1 Here";

    if(send(sock, buf.c_str(), strlen(buf.c_str()), 0) < 0) {
        cout<<"\nError sending data from client 1 "<<errno;
        exit(1);
    }
    cout<<"\nExiting normally";
    return 0;
}

即使我在服务器端收到错误,我也没有在客户端收到错误消息 - 它只是正常退出。

根据 - http://www.workers.com.br/manuais/53/html/tcp53/mu/mu-7.htm错误消息仅表示“无效参数”。 但我不知道如何准确解释……如果一个论点无效,为什么它还要编译?

如果有人能指出我在这里做错了什么,我将不胜感激。 欢迎您指出任何其他小笔记。 谢谢你的帮助。

除了代码中的所有其他问题之外,您还试图读取错误的文件描述符 - 它应该是new_sd ,而不是sock ,它是一个服务器套接字并且只能accept()新连接。

编辑0:

大嘘声:

if( new_sd = accept(sock, &name, (socklen_t*)&adrlen) < 0) { ...

这相当于:

if( new_sd = (accept(sock, &name, (socklen_t*)&adrlen) < 0)) {

所以new_sd得到了完全错误的值。 一般的智慧是不要将作业放入条件句中。 考虑以高警告级别编译,至少-Wall -pedantic

在您的代码中看起来有问题的一件事是,当您应该从recv recv new_fd ,您正在接收sock 不知道为什么会给出EINVAL

EINVAL错误(通常)在编译时无法检测到。文件描述符是普通的int s。编译器无法知道哪些int s 在运行时是有效的文件描述符,或者flags的特定组合是否对您正在使用的 sockets 有效例如。)

在 'recv()' 调用中(在服务器中),'flags' 参数不能为 0:

recv(sock, buf, 14, 0)

尝试类似:

recv(sock, buf, 14, MSG_WAITALL)

有关“标志”参数的完整选项列表,请参见“手册”页面。 在这里,人们必须对如何接收信息做出明智的选择。

客户端没有收到错误消息(INVALID ARG)的原因是因为它不做任何recv......只有服务器在做receive's。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM