繁体   English   中英

C UDP套接字不起作用

[英]C UDP socket not working

我在C中进行套接字编程的一项家庭作业遇到了问题。我们正在使用UDP做一个简单的客户端/服务器操作,而我在服务器上遇到了问题..这是一个片段:

int main(int argc, char *argv[])
{
    int sockfd, newsockfd, portno;
    socklen_t clilen;
    char buffer[PACKET_DATA_LENGTH];
    struct sockaddr_in serv_addr, cli_addr;
    int n;
    if (argc < 2) {
        fprintf(stderr,"ERROR, no port provided\n");
        exit(1);
    }
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
        error("ERROR opening socket");

最初sockfd = socket(AF_NET, SOCK_DGRAM, 0)SOCK_STREAM ,但是由于项目规范是在UDP中而不是在TCP中完成的,所以我将STREAM更改为DGRAM

我这样称呼服务器: ./receiver 1234

我得到错误: ERROR on accept: Operation not supported on socket出错: ERROR on accept: Operation not supported on socket

但是,如果我将其从DGRAM更改回STREAM它将进行编译,。/ ./receiver 1234可以正常工作。

救命?

谢谢! -kstruct

编辑这就是error()的样子(这是预先给定的代码,我没有编写,它是项目的一部分)

void error(const char *msg)
{
    perror(msg);
    exit(1);
}

EDIT2这是我的更多代码(在我发布的第一段代码之后,紧接着是什么)..我猜样板代码确实调用了accept(),但那不应该触发不同的输出消息吗? 也就是说,它不应该说ERROR opening socket而不是ERROR on accept吗?

bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
      error("ERROR on binding");
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) 
    error("ERROR on accept");

UDP是无连接的。 你为什么要打电话accept

accept(2)对于无连接数据报协议(例如UDP accept(2)没有意义。 accept(2)仅适用于SOCK_STREAMSOCK_SEQPACKET协议。

可以 connect(2) UDP协议以要求内核提供更多过滤,但这并不总是令人满意的。

暂无
暂无

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

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