Tag: 套接字

C,套接字编程:使用select()将多个客户端连接到服务器

我正在尝试制作一个可以由多个客户端连接的服务器。 到目前为止,这是我的代码: 客户: int main(int argc, char **argv) { struct sockaddr_in servaddr; int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == -1) perror(“Socket”); bzero((void *) &servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(6782); servaddr.sin_addr.s_addr = inet_addr(); if (-1 == connect(sock, (struct sockaddr *)&servaddr, sizeof(servaddr))) perror(“Connect”); while(1) { char message[6]; fgets(message, 6, stdin); message[5] = ‘\0’; […]

getsockname总是返回0.0.0.0?

这是代码。 它与此类似问题的代码相同: http : //monkey.org/freebsd/archive/freebsd-stable/200401/msg00032.html 。 当我运行它时,我总是得到输出: 听取0.0.0.0:54493或其他什么。 显然端口发生了变化,但我不知道为什么我一直在获得0.0.0.0的IP地址。 我错过了什么吗? #include #include #include #include #include #include #include int main() { int sock; int len = sizeof(struct sockaddr); struct sockaddr_in addr, foo; if((sock=socket(AF_INET, SOCK_STREAM, 0))<0) { exit(0); } memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(0); if(bind(sock, (struct sockaddr *) &addr, […]

套接字如何在C中工作?

我对C中的套接字编程有点困惑。 您创建一个套接字,将其绑定到一个接口和一个IP地址,然后让它听。 我发现了几个网络资源,并且理解得很好。 特别是,我发现一篇文章在Unix系统下的网络编程非常有用。 令我困惑的是数据到达套接字的时间。 你怎么知道数据包何时到达,数据包的大小,你是否必须自己完成所有繁重的工作? 我的基本假设是数据包可以是可变长度的,所以一旦二进制数据开始出现在套接字中,你如何开始构造数据包呢?

获取C中LAN上的设备列表

我想获得一个连接到我的本地网络的可用设备列表(它们的IP地址或主机名应该没问题)。 我在C#中有一些例子,但我找不到任何使用C / C ++的示例。 我很熟悉BSD套接字API,只是为了澄清。 我有一个“存根”的想法:也许我应该确定我的LAN上的设备可能属于的IP地址的范围,然后确定它们是否例如响应PING或类似的东西。 我怎么能实现这些? 我希望我的应用程序在Linux和iOS上运行。 这就是为什么我更喜欢BSD套接字,或者最喜欢的是Foundation / GNUstep(尽管它们是用Objective-C编写的)。

Linux内核与用户空间程序之间的通信

我目前正在编写Linux内核模块,并且在实现与用户空间程序的通信时遇到问题。 此内核模块需要接收用户空间程序发出的任务,并在完成后将结果发送回用户空间程序。 在内核模块执行其工作时,应阻止用户空间程序。 我认为内核用户空间IPC或Unix套接字会很好,但我没有找到谷歌的例子。 目前我丑陋的解决方案是导出chardev并让用户空间程序将请求写入设备文件,并从中读取结果。 但我只能在每次open()调用时发出一个请求,这会导致新问题。 我真的需要一个IPC或类似套接字的东西。 谢谢!

Web浏览器不解释通过unsigned char数组传递的图像

我想要做的基本上是通过套接字捕获浏览器的HTTP GET请求并将该请求发送到Internet,然后捕获回复并将其发送回浏览器。 当转移仅由文本组成时,每件事都完美无缺。 但是在下载图像时。 浏览器给出错误“无法显示图像,因为它包含错误”。 任何帮助将不胜感激。 #include “cc352.h” #include #include #include #include int main(int argc, char **argv) { int listenfd, connfd,weblin,webcon,webwrite,n,x,y,w,w1; socklen_t len,wlen; struct sockaddr_in servaddr, cliaddr , webservad , webcliad; unsigned char buff[3072] , buff2[3072] ,ext[5] ,wbuff[100000]; time_t ticks; int yes = 1; const char *ptr; if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < […]

为什么当我使用“control-c”来关闭发送对等体上的套接字时,接收对等体上的套接字继续无限接收

我是套接字编程的新手,我知道使用“control-c”关闭套接字是一个坏习惯,但为什么接收对等体上的套接字在我使用“control-c”关闭发送过程后仍然无限接收? 在“control-c”退出进程后,不应该关闭发送对等体上的套接字吗? 谢谢!

套接字编程中的htons()函数

我是socket编程的新手,我正在尝试理解htons()的操作。 我已经在互联网上阅读了一些这样的教程,例如这个 。 但我无法理解htons()究竟是做什么的。 我尝试了以下代码: #include #include #include #include int main( int argc, char *argv[] ) { int sockfd, newsockfd, portno, clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; /* First call to socket() function */ sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("ERROR opening socket"); exit(1); } /* Initialize socket […]

getpeername总是给出错误的文件描述符

我有以下代码,我试图用来获取套接字另一端的地址,但getpeername()总是失败, bad file descriptor错误。 我究竟做错了什么? #include #include #include #include #include #include #include #include #include #include #include #include #include /* For SYS_write etc */ #include #define ORIG_RAX 15 #define SYSCALL_MAXARGS 6 #define RDI 14 int main() { //**********declarations and memory allocations**********// ssize_t size; long sys_call_number, temp_long; int status, temp, i, j, k, flag; struct sockaddr_in ip_addr_struct; […]

删除打开的TCP连接而不发送RST

查看nginx:忽略一些没有正确主机头的请求让我觉得实际上不可能通过向另一端发送RST (和/或FIN )而没有OS正确终止底层TCP连接来close(2) TCP连接。 一种解决方法是使用类似tcpdrop(8)东西,但是,从OpenBSD和FreeBSD 上的usr.sbin/tcpdrop/tcpdrop.c可以看出,它是通过基于sysctl的接口实现的,并且可能有外部的可移植性问题BSD系统。 (实际上,看起来甚至基于sysctl的实现在OpenBSD和FreeBSD之间可能不同,需要一个移植层 – OpenBSD使用 tcp_ident_mapping结构(随后,它包含两个sockaddr_storage元素,加上一些其他信息),而FreeBSD , DragonFly和NetBSD直接使用两个sockaddr_storage元素的数组。)事实certificate,OpenBSD的tcpdrop似乎确实根据tcpdump(8)发送了R数据包,并且可以通过查看/sys/netinet/tcp_subr.c :: tcp_drop()来确认/sys/netinet/tcp_subr.c :: tcp_drop() ,最后调用tcp_close() (并确认 tcp_close() 在其他地方发送RST ),因此,似乎它甚至都不起作用。 如果我自己通过C建立连接,有没有办法随后丢弃它而不确认另一方,例如,没有启动RST ?