Tag: 套接字

启用非阻塞套接字

我有一个用C / C ++编写的服务器。 我为连接设置了包装器,如下所示: //START WRAPPER void Server::init_address(int port) { memset(&(this->serv_addr), 0, sizeof(this->serv_addr)); this->serv_addr.sin_family = AF_INET; this->serv_addr.sin_port = htons(port); this->serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); } int Server::w_socket() { int retv; retv = socket(PF_INET, SOCK_STREAM, 0); //FIXME //fcntl(retv, F_SETFL, O_NONBLOCK); if(retv == -1) { std::string err_msg(strerror(errno)); err_msg = “[socket] ” + err_msg; throw err_msg; } else { […]

在两个客户端套接字之间发送数据

我必须在Mac-OS上使用C套接字创建一个应用程序,它将数据从一个套接字发送到其他套接字,就像这样。 服务器等待连接 客户端连接到服务器(从1开始)。 – > socket1 服务器连接到外部服务器并获取套接字。 – > socket2 从现在开始,服务器工作就完成了。 数据交换应仅在客户端套接字(从2)和从3获得的套接字之间进行。 当前实现:服务器建立连接,然后从一个套接字读取数据并发送给其他套接字。 任何想法如何在第3步之后管道两个套接字socket1和socket2。

发送Http“发布”请求到C或C ++中的Php代码

我正在尝试向我的php文件发送“post”reguest并获取信息,它工作正常,但是 它还会在从php文件打印我的响应之前打印一些东西。 这就是它的印刷品 第一: HTTP / 1.1 200好的 日期:星期五,2012年4月20日10:19:12 GMT 服务器:Apache / 2.2.21(Unix)mod_ssl / 2.2.21 OpenSSL / 0.9.8r DAV / 2 PHP / 5.3.6 X-Powered-By:PHP / 5.3.6 内容长度:12 连接:关闭 内容类型:text / html 然后我的回答: 你好,世界 我怎么能只打印我从myphp代码中得到的东西,没有: HTTP / 1.1 200好的 日期:星期五,2012年4月20日10:19:12 GMT 服务器:Apache / 2.2.21(Unix)mod_ssl / 2.2.21 OpenSSL / 0.9.8r DAV / 2 PHP / 5.3.6 […]

如何使用getifaddr()函数获取IPV6接口地址

我有getifaddrs()定义,但它适用于IPv4。 请指导我如何使用getifaddrs()函数获取IPv6地址。

从带有MSG_ERRQUEUE标志的recvmsg读取ICMP有效负载

我正在使用BSD套接字来构建一个不需要root权限的高级traceroute程序(如tracepath)。 使用UDP和绑定套接字,我调用: recvmsg(socket, header, MSG_ERRQUEUE) 我收到有关先前发送的数据包已触发的假定ICMP通知的信息。 您知道是否可以访问ICMP有效负载(应该是先前发送的数据包)? 我从recvmsg手册页中读到: [..] The payload of the original packet that caused the error is passed as normal data via msg_iovec. [..] 但是我找不到任何有用的东西,它只是随机数据(我用wireshark来交叉检查数据)。

在对等端关闭的TCP套接字上写入

我有一个客户端 – 服务器应用程序,其中每一方通过TCP套接字与另一方通信。 我正确建立连接,然后在客户端在套接字上写入任何数据之前崩溃服务器。 我看到的是第一次write()尝试(客户端)成功并返回实际的写入字节数,而后面的返回(如我所料) -1 (接收SIGPIPE )和errno=EPIPE 。 为什么第一个write()即使套接字已经关闭也是成功的? 编辑有时候下面的write()也有一个正的返回值,好像一切顺利。

套接字编程:sendto总是以errno 22(EINVAL)失败

我总是没有发送任何字节,使用此代码的错误为22(EINVAL,无效参数)。 destination_host在别处设置并且已知有效,所以我真的看不到发生了什么。 MAXMSGSIZE是1000.没有错误或警告。 我正在使用-Wall -Werror -pedantic编译 char *data_rec; u_int data_len; int sockfd; uint16_t *ns; struct sockaddr_in address; struct sockaddr *addr; char *ip; int i; int errno; int bytes_sent; data_len = MAXMSGSIZE; data_rec = malloc(sizeof(char)*MAXMSGSIZE); ns = malloc(MAXMSGSIZE*sizeof(uint16_t)); ip = malloc(MAXMSGSIZE*sizeof(char)); data_rec = “some random test stuff”; sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if(sockfdh_addr,ip,MAXMSGSIZE); memset(&address, 0, sizeof(address)); […]

为什么POSIX与ISO C标准相矛盾

见http://pubs.opengroup.org/onlinepubs/009696699/basedefs/sys/socket.h.html ( http://pubs.opengroup.org/onlinepubs/9699919799来自第7期 – 从2013年开始,仍然是相同的!) sockaddr_storage应该转换为其他结构类型,但据我所知,这与ANSI和ISO C标准别名规则相矛盾。 (可以通过指向不兼容类型的指针访问对象,但可以通过3个char类型访问任何内容,并且结构及其第一个成员可以互换。) 我知道在C标准化之前很久就存在使用套接字的做法,但POSIX应该符合ISO C,实际上它与其手册中的标准相矛盾。 (即使在较新版本的POSIX中。) 他们为什么一开始就这样做? 他们为什么不改变它?

UDP和套接字,recvfrom()返回-1,资源暂时不可用

我有一个客户端和一个服务器与C中的数据报(UDP)通信。客户端发送5个消息,并在收到消息后,服务器发回消息。 在客户端完成接收消息之前,接收和发送消息是很好的。 服务器发回所有消息后,它将使用close()终止。 所以来自客户端的recvfrom()应该返回0,对吗? 假设recvfrom()应该在服务器端close()时返回0,它返回-1,而错误资源暂时不可用。 此资源是否是从服务器关闭套接字的引用? 或者它是否与完全不同的东西完全不同,如用完缓冲区或其他东西(我认为不是这样)? 假设我的假设是错误的,并且由于服务器终止而返回-1,我可能应该处理错误 if(SOMEMACRO) do something 我怎样才能知道SOMEMACRO是什么? 我打印出错误,但它说资源临时不可用,recvfrom()描述没有提到无法使用的资源..? 顺便说一句,这是一个非阻塞套接字,如果这有任何区别,因为我读到如果设置O_NONBLOCK并且没有可用的消息,它会将errno设置为EAGAIN或EWOULDBLOCK。 O_NONBLOCK未设置但MSG_DONTWAIT已设置。 它们与一般文件描述符的O_NONBLOCK基本相同,而MSG_DONTWAIT是否是特定于套接字的? 我的大脑现在没有那么好用,如果有人可以启发我并澄清我的困惑,我会深深体会到这一点。 谢谢!

c /中断系统调用/ fork与线程

我发现了线程实现的问题,这对我来说很奇怪。 也许有些人可以向我解释一下,会很棒。 我正在开发类似代理的程序,一个程序(在不同的机器上运行),它通过eth0接收数据包并通过ath0(无线)发送到另一台完全相同的机器。 实际上我完全不确定是什么导致了我的问题,那是因为我对一切,linux和c编程都是新手。 我开始两个线程, 一个是在eth0上侦听(套接字)传入的数据包并通过ath0(也是套接字)发送出去 另一个线程正在监听ath0并通过eth0发送。 如果我使用线程,我会得到一个错误: sh-2.05b# ./socketex Failed to send network header packet. : Interrupted system call 如果我使用fork(),程序按预期工作。 有人可以向我解释这种行为吗? 只是为了显示发件人实现,这里是它的代码片段: while(keep_going) { memset(&buffer[0], ‘\0’, sizeof(buffer)); recvlen = recvfrom(sockfd_in, buffer, BUFLEN, 0, (struct sockaddr *) &incoming, &ilen); if(recvlen < 0) { perror("something went wrong / incoming\n"); exit(-1); } strcpy(msg, buffer); buflen = strlen(msg); […]