Tag: sockets

使用c中的FILE流读取/写入套接字

我发现了一个很好的抽象,我可以使用FILE从UDP读取数据。 这对于读取数据非常有用,但是我无法通过UDP吐出数据。 以下是通过FILE流读取UDP数据的代码: u_int8 *buf; int sockfd = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in serverAddr; if (sockfd < 0) { printf("Could not open socket\n"); exit(1); } buf = malloc(BUF_SIZE * sizeof(u_int8)); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); serverAddr.sin_port = htons(port); int rc = bind(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); if (rc<0) { printf("Could not bind to port […]

试图退出阻塞的UDP套接字读取

这是一个类似于关闭阻塞UDP套接字的正确方法的问题。 我在C中有一个从UDP套接字读取的线程。 读取是阻止的。 我想知道是否有可能退出线程,而不依赖于recv()返回? 例如,我可以从另一个线程关闭套接字并安全地期望套接字读取线程退出吗? 在那个post上没有看到任何高投票的答案,这就是为什么我再次问它。

如何在C中创建用于读取套接字数据的缓冲区

使用C / C ++套接字编程,以及“读取(socket,buffer,BUFSIZE)”方法。 究竟什么是“缓冲区”我知道char和byte是相同的东西,但是字节数组中有多少元素呢? 缓冲区是否需要能够保存整个消息,直到空字符?

从getaddrinfo()获取服务器ip 0.0.0.0:0

我正在关注关于NP的Beej指南。 我做了一些修改,并试图通过getaddrinfo()获取我的服务器程序的IP。 (原文可在此处找到http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#simpleserver ) 以下是我更改/添加的部分。 if ((rv = getaddrinfo(NULL, “0”, &hints, &servinfo)) != 0) { //0 for random port? fprintf(stderr, “getaddrinfo: %s\n”, gai_strerror(rv)); return 1; } //… some code emitted … //freeaddrinfo(servinfo); //I still need it! printf(“ip: %s\nport: %d\n”, inet_ntop(AF_INET, &((struct sockaddr_in *)p->ai_addr)->sin_addr, ip4, INET_ADDRSTRLEN), ntohs(((struct sockaddr_in *)p->ai_addr)->sin_port) ); 问题是我得到了结果 ip: 0.0.0.0 port: 0 Q1:我从几个网站上读到,为端口设置“0”告诉操作系统你想要下一个可用端口,而不是实际为0.这是真的吗? […]

poll()在超时为0时做什么?

我正在查看poll() 手册页 ,它告诉我当为timeout参数传递正值和负值时poll()的行为。 它不会告诉我如果超时为0会发生什么。 有任何想法吗? 查看epoll_wait() 手册页 ,它告诉我,当超时值为0 ,即使没有可用事件,它也会立即返回。 假设poll() 行为方式相同是否安全?

IRC Bot:错误 – 注册超时

我在C中制作一个简单的IRC Bot。我终于让机器人连接并接收信息。 我的代码也应该发送,但服务器的行为就好像它没有发送任何东西。 当机器人连接时,我会收到: 收到:: roc.esper.net注意事项:***查找你的主机名…… 收到:: roc.esper.net注意事项:***找到您的主机名 我的代码发送到这一点: 发送:NICK Goo 发送:USER Goo * *:Goo 我决定使用wireshark这是你应该在初始连接后发送的注册。 但是,我不确定数据是否实际发送或者它可能无效? 因为在没有任何东西约30秒之后我也会收到这个: 收到:错误:结账链接:c-68-33-143-182.hsd1.md.comcast.net(注册超时) 然后我的程序关闭了。 有没有其他人对irc中的程序设计/注册过程有所了解? 或者其他任何人都有任何有用的想法吗? 谢谢 **编辑**修正。 我需要在每行的末尾发送行终止符。 \ r \ n

C语言中的Socket程序无法编译

大家好我正在读一本关于套接字编程的书,有两个代码客户端和服务器。 这是服务器代码 #include #include #include #include void error(char *msg) { perror(msg); exit(1); } int main(int argc, char *argv[]) { int sockfd, newsockfd, portno, clilen; char buffer[256]; 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_STREAM, 0); if(sockfd < 0) error("ERROR OPENING SOCKET"); bzero((char […]

关于epoll_ctl()

当使用epoll_ctl()时,我发现第三个参数“fd”是epoll文件描述符“epfd”之外的另一个文件描述符。 我看到了这样一个例子: event.data.fd = sfd; //sfd is a fd for listening event.events = EPOLLIN | EPOLLET; s = epoll_ctl (efd, EPOLL_CTL_ADD, sfd, &event); 正如我所看到的,event.data.fd中的文件描述符与epoll_ctl中的第三个参数相同,为什么需要两次传递这个描述符? 有什么区别吗?

接受多个后续连接到套接字

我有一个监听器,它将任意数据,HTTP请求传递给网络套接字,然后通过TCP传递。 这适用于第一个请求,但侦听器不接受后续的新请求。 我的问题是: 如果我有sock=accept(listener,(struct addr *)&sin, &sinlen); 然后,基于套接字函数引用,侦听器套接字保持打开状态,我应该能够为后续请求多次重新调用accept() 。 它是否正确? 如果是这样,有人比我更熟悉套接字编程,请解释一下这段代码的外观吗?

客户端/服务器套接字通信(AF_UNIX)

我正在尝试编写一个客户端程序和一个服务器程序,当客户端连接到服务器时,服务器会将文件中的随机字符串发送回它。 这是我到目前为止(从文件中省略): server.c #include #include #include #include #include #include #include int listfd; int connfd; int main(int argc, char *argv[]){ /* * Create Sockets */ listfd = socket(AF_UNIX, SOCK_STREAM, 0); if(listfd == -1) exit(-1); struct sockaddr saddr = {AF_UNIX, “server”}; socklen_t saddrlen = sizeof(struct sockaddr) + 6; bind(listfd, &saddr, saddrlen); listen(listfd, 10); fflush(stdout); printf(“Running…\n”); /* * […]