Tag: 套接字

使用select读取和写入相同的套接字(TCP)

我们正在写一个客户端和服务器(我认为是)非常简单的网络通信。 多个客户端连接到服务器,然后服务器将数据发送回所有其他客户端。 服务器只是位于阻塞select循环中等待流量,当它到来时,将数据发送到其他客户端。 这似乎工作得很好。 问题是客户。 在阅读时,它有时会想要写一次。 但是,我发现如果我使用: rv = select(fdmax + 1, &master_list, NULL, NULL, NULL); 我的代码将阻塞,直到有新数据要读取。 但有时(异步,来自另一个线程)我将在网络通信线程上写入新数据。 所以,我希望我的select定期唤醒,让我检查是否有要写的数据,如: if (select(….) != -1) { if (FD_SET(sockfd, &master_list)) // handle data or disconnect else // look for data to write and write() / send() those. } 我尝试将选择设置为轮询模式(或荒谬的短暂超时): // master list contains the sockfd from the getaddrinfo/socket/connect […]

如何使用原始套接字在C中接收ICMP请求

这是一项任务,必须使用原始套接字。 我需要编写一个简单的icmp ping程序。 我用这个作为基础http://www.pdbuchan.com/rawsock/icmp4.c 。 第127行是wlan0,Im使用eth0。 在第290行,我编码: ` struct sockaddr_in rec; unsigned char * pkt = (unsigned char *) malloc (IP_MAXPACKET * sizeof (unsigned char)); if (recvfrom (sd, (void*)pkt, IP4_HDRLEN + ICMP_HDRLEN+datalen , 0, NULL, (socklen_t*)sizeof (struct sockaddr)) ip_dst), (char*)inet_ntoa(*(struct in_addr*)&ip->ip_src), icmp->type); free (pkt); `问题是ip_dst和ip_src显示为我的机器的IP,icmp类型显示为0而不是8. Wireshark显示icmp回复和请求。 可能我的recvfrom是错误的,但我听说有关linux自己的TCP / IP可能正在处理数据包。 如果这是真的,那么解决方法是什么? 编辑:我检查了这个原始套接字监听器,但它没有解决我的问题。

如何在C中通过TCP发送整数数组?

我认为write()只能发送byte的数据缓冲区(即signed char),那么如何使用sys / socket.h库中的C write()函数发送长整数数组呢? 显然,我不能只是强制转换或转换为char,因为任何超过127的数字都会格式不正确。 我看了一下这个问题, 如何将整数数组分解为一个字节数组(像素编码) ,但是无法理解它 – 如果这是我正在寻找的东西,请有人愚蠢一点吗? 跟进问题: 为什么从TCP套接字读取整数数组时会得到奇怪的结果?

C socket:确实发送等待recv结束?

我在Windows上使用阻塞C套接字。 我使用它们将数据的更新从服务器发送到客户端,反之亦然。 我以高频率(每100毫秒)发送更新。 send()函数是否会等待收件人recv()在结束之前接收数据? 如果我理解man手册页,我会假设: “send()的成功完成并不能保证传递信息。” 那么,如果一个运行10个send()而另一个只有完整的1个recv()什么? 我是否需要使用某种确认系统?

在C中通过TCP发送和接收整数值

在程序中,我需要通过TCP套接字发送一个整数值。 我为此目的使用了send()和recv()函数,但它们只是以字符串forms发送和接收它。 是否有send()和recv()替代方法,以便发送和接收整数值?

getsockopt()中的SOL_SOCKET

如linux手册页中所述“使用此常量作为getsockopt或setsockopt的level参数来操作本节中描述的套接字级别选项。” 我还是不知道SOL_SOCKET是什么意思,它做了什么?

如何在C中打开和使用套接字?

我想知道用C编程语言打开和写入数据到套接字的最简单,最有效的方法,用于网络编程。

使用Winsock将客户端TCP套接字绑定到特定本地端口时,SO_REUSEADDR没有任何影响

我将客户端 TCP套接字绑定到特定的本地端口。 为了处理套接字保持TIME_WAIT状态一段时间的情况,我在套接字上使用带有SO_REUSEADDR setsockopt() 。 它适用于Linux,但不适用于Windows,当前一个连接仍在TIME_WAIT时,我在connect()调用时得到WSAEADDRINUSE 。 MSDN并不完全清楚客户端套接字会发生什么: […]对于需要将多个套接字绑定到同一端口号的服务器应用程序,请考虑使用setsockopt ( SO_REUSEADDR )。 客户端应用程序通常不需要在所有连接上调用bind-connect自动选择未使用的端口。 […] 我该如何避免这种情况?

如何在C中为客户端提供特定的IP地址

我试图在C中实现一个简单的客户端和服务器,我在网上找不到如何为客户端设置特定IP地址的示例。 这是我到目前为止所得到的: sockfd = socket(PF_INET, SOCK_STREAM, 0); if (sockfd == -1) { } address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(); address.sin_port = htons(); len = sizeof(address); int result = connect(sockfd, (struct sockaddr *)&address, len); 在服务器端,我检查客户端IP地址,我总是得到127.0.0.1 我想改变一些与众不同的东西。

在使用之前将诸如sockaddr_in,sockaddr_in6和addrinfo之类的结构清零时,这是正确的:memset,初始化器还是其中之一?

每当我在书籍,手册页和网站中查看真实代码或示例套接字代码时,我几乎总会看到类似下面的内容: struct sockaddr_in foo; memset(&foo, 0, sizeof foo); /* or bzero(), which POSIX marks as LEGACY, and is not in standard C */ foo.sin_port = htons(42); 代替: struct sockaddr_in foo = { 0 }; /* if at least one member is initialized, all others are set to zero (as though they had static storage duration) […]