我在 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
我收到错误:接受时出错:套接字不支持操作
但是,如果我将它从 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/