Tag: 套接字

如何使用C套接字编程下载文件

我如何制作像互联网下载管理器的程序从互联网下载给定链接的文件。 可以使用套接字编程C从Internet下载文件。 我们将不胜感激。 谢谢。

链接范围IPv6多播数据包突然无法在MacBook Pro上路由?

这是一个有点模糊的问题,但我很难过,我想也许有人可能会对这个问题有更多的线索。 我的同事已成功运行一个内部应用程序,在他的MacBook Pro上使用IPv6多播几个月,但今天Mac决定停止路由多播数据包。 特别是,程序打印此错误: 网络接口上的SendDataUDP(ff02 :: bead:cede:deed:feed @ 4)失败[名称= [en0]描述= [] IP = [fe80 :: 222:41ff:fe21:dfd4 @ 4]网络掩码= [ffff: ffff:ffff:ffff ::] Broadcast = [::]](错误= 65 /无主机路由)。 …它很好地描述了出错的地方……它试图将UDP数据包发送到所显示的IP地址,并且发送()失败并使用errno = EHOSTUNREACH。 我不明白的是,什么可能导致IPv6链路范围多播地址“无法访问”? 如果我对链路范围组播的理解是正确的,那么数据包只需要从本地以太网端口出来(在这种情况下为en0,它在该机器上运行)。 我缺少多播的某些方面,还是他的机器只是被塞了? 他说他没有改变什么,只是神秘地停止了工作。

我应该使用文件描述符或流来读取/写入套接字

设置套接字后,最好在套接字描述符上使用read(2)和write(2)调用,或者使用fdopen(3)将流与套接字描述符关联,然后使用stdio(3)函数? int sfd = socket(PF_INET, SOCK_STREAM, 0); // setup the socket using sfd FILE * stream = fdopen(sfd, “r+”); // use fprintf, fscanf, etc 编辑:我也解密了流 setbuf(stream, NULL) 为了避免像评论中提到的那样冲洗它。 我一直在使用这种方法,因为它允许我重用为FILE *流编写的代码,并且我有能够使用格式字符串的优点。 GNU似乎暗示这是一个好主意。 http://www.gnu.org/software/libc/manual/html_node/Streams-and-File-Descriptors.html 但是,通常当我看到使用套接字的代码时,使用套接字描述符而不是所有操作的流。 使用较低级别的function是否有优势?

c中有刺激性的select()行为

while (xxx) { timeout.tv_sec=TIMEOUT; timeout.tv_usec=0; FD_ZERO(&set); FD_SET(sd,&set); switch (select(FD_SETSIZE,&set,NULL,NULL,&timeout)) xxxxx } 然而,工作正常 FD_ZERO(&set); FD_SET(sd,&set); while (xxx) { timeout.tv_sec=TIMEOUT; timeout.tv_usec=0; switch (select(FD_SETSIZE,&set,NULL,NULL,&timeout)) xxxxx } 没有。 它第一次工作,但下次它运行while循环时,即使sd套接字接收数据,它也会获得超时。 在我看来,每次都必须清空和填充设置是浪费资源。 任何人都有一个很好的解释为什么这是,甚至更好,也许是一个如何避免它的建议?

如何在套接字编程中发送长度大于缓冲区的消息?

我正在使用C ++中的Winsock开发一个应用程序。 我有一个200字节长的char数组,用于通过套接字发送字符串。 我的问题是当发送大于char数组的消息时,所以我决定以多个块发送它们,但我不知道该怎么做。 为了发送和接收数据,我使用常规的send()和recv()函数: recv(client, buffer, 200, NULL); send(client, buffer, 200, NULL); 更新 我有一个结构: struct Pack { unsigned int senderId; char str[200]; } 在发送之前我将struct转换为char数组。 Pack pk; strcpy_s(pk.str, 200, “Some text to send.\0”); pk.senderId = 1 // user id char *buffer = (char*)pk; 如果字符串大小如果大于200则strcpy_s()崩溃。

在UDP中接收错误:连接被拒绝

我试图在特定端口通过UDP向服务器发送字符串HI,然后接收响应。 但是,在我尝试使用recvfrom()获取响应后,我陷入阻塞状态。 我尝试使用连接的UDP,但我得到: 在UDP中接收错误:连接被拒绝 这可能是什么原因? 服务器不在我的控制之下,但我知道它工作正常。 我添加了代码 int sockfdudp; char bufudp[MAXDATASIZE], port[6]; struct addrinfo hints, *servinfo, *p; struct sockaddr_storage addr; int rv; char s[INET6_ADDRSTRLEN]; int bytes_recv, bytes_sent; socklen_t len; scanf(“%s”,port); printf(“UDP Port: %s \n”, port); // Start connecting to datagram server memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; if ((rv = getaddrinfo(SERVER_NAME, […]

是否有必要尝试连接getaddrinfo()返回的所有地址?

Beej的Simple Client示例代码迭代从getaddrinfo()返回的所有IP地址,直到它可以连接到第一个IP地址。 请参阅下面的代码。 这总是必要的,还是可以假设我们只需要尝试连接到getaddrinfo()返回的第一个地址? memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if ((rv = getaddrinfo(argv[1], PORT, &hints, &servinfo)) != 0) { fprintf(stderr, “getaddrinfo: %s\n”, gai_strerror(rv)); return 1; } // ———————————————————— // loop through all the results and connect to the first we can for(p = servinfo; p != NULL; p = p->ai_next) […]

创建ip网络数据包

我必须手动创建自己的网络数据包使用任何Protocol.i应该发送到客户端并解析或分析数据包。可以帮助我在哪里和hpw启动??? 我对sockets编程有所了解..

C / C ++套接字和非阻塞recv()

我遇到一个调用recv()系统调用没有阻塞的问题。 我现在有一个客户端 – 服务器结构设置,而我遇到的问题是我向服务器发送一条消息,而服务器设置为以下是这样的: while (1) { char buf[1024]; recv(fd, buf, sizeof(buf), flags); processMsg(buf); } 它正确接收第一条消息,但recv()不会阻止和“接收”不是所需的垃圾数据。 我只想在发送邮件时才对邮件做出反应。 任何人都可以建议吗?

通过套接字文件描述符上的ioctl调用获取数据包时间戳

我正在研究运行嵌入式Linux的系统。 我正在尝试从我在套接字上收到的流中获取数据包时间戳。 创建套接字后,我执行以下操作: if (fd != -1) { int enabled = 1; setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP, &enabled, sizeof(enabled); } 之后我绑定套接字,套接字的类型为SOCK_STREAM。 我通过调用函数recv(fd, buf, size, 0)成功接收套接字上的数据。 现在,为了获取接收数据的时间戳,我目前正在尝试以下方法: ret = recv(fd, buf, size, 0); if (ret > 0) { struct timeval tv_ioctl; tv_ioctl.tv_sec = 0; tv_ioctl.tv_usec = 0; int error = ioctl(fd, SO_TIMESTAMP, &tv_ioctl); printf(“%ld.%ld – error = %d”, […]