[英]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_STREAM
和SOCK_SEQPACKET
协议。
您可以 connect(2)
UDP协议以要求内核提供更多过滤,但这并不总是令人满意的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.