C UDP套接字不工作

标签 c sockets tcp udp

我在 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 中完成,我更改了 STREAMDGRAM

我这样调用服务器:./receiver 1234

我收到错误:接受时出错:套接字不支持操作

但是,如果我将它从 DGRAM 改回 STREAM,它会编译并且 ./receiver 1234 工作正常。

帮忙吗?

谢谢! -构造

编辑 这就是 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

关于C UDP套接字不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8966204/

相关文章:

不使用 sprintf() 将 float 转换为字符串

c - 如何在 C 中实现类似 nasm 的结构?

javascript - 如何仅为某些用户添加按钮 - socket.io

python - 如何解决Python套接字/套接字服务器连接[Errno 10048]和[Errno 10049]?

python - 如何让 python 在 Linux 上使用管道读取 tcpdump 捕获的 .pcap 数据?

LTE 中承载添加/切换事件期间的 TCP session

c - fileno() 和大于 2gb 的文件

C 中数组初始化的困惑

java - 客户端服务器套接字 java.net.SocketException : Software caused connection abort: recv failed

c - 如何检查 Linux/FreeBSD 上 write() 调用被阻止的问题?