我正在编写一个简单的程序来发送/接收TCP数据包并将其合并到一个更大的项目中.我卡在校验和部分,我计算的数字与wireshark数字不匹配.
对于校验和功能,我重新使用Mike Muss的代码如下:
static int
in_cksum(u_short *addr, int len)
{
register int nleft = len;
register u_short *w = addr;
register int sum = 0;
u_short answer = 0;
/*
* Our algorithm is simple, using a 32 bit accumulator (sum), we add
* sequential 16 bit words to it, and at the end, fold back all the
* carry bits from the top 16 bits into the lower 16 bits.
*/
while (nleft > 1) {
sum += *w++; …Run Code Online (Sandbox Code Playgroud) 我想找出我的外部IP地址.
一个非常常见的解决方案是设置BufferedReader指向该网站http://checkip.amazonaws.com.
是否有一个解决方案,但没有连接到外部网站这样做 - 或者换句话说,我怎么能以编程方式找到我的外部 IP地址?
基于这个问题,当你调用已经使用closesocket()的套接字时,数据包将被发送到另一端而不是执行正常的断开连接(4次握手).recv()RST
但我希望执行一个优雅的断开连接,所以我需要recv()在呼叫之前退出closesocket().
有没有办法做到这一点?
根据MSDN上的documenation,IPEndPoint可以有它Address和Port属性进行设置.
为什么这个课程设计为可变的?似乎它应该是不可变的,因为类似的原因是相同String的.
这个类的不可变版本是否更适合传递线程,事件处理程序等?
我的应用程序连续向不同的主机发送UDP数据包 当主机处于活动状态时,UDP数据包到达主机,sendto函数返回发送给它的字节数.但是当主机出现故障(电缆拔出或重置)时,sendto功能不会发送UDP数据包,但仍会返回缓冲区中的字节数.不会发送UDP数据包,而是发送ARP数据包以查找主机.为什么sendto函数不返回SOCKET_ERROR?WSAGetLastError函数也返回0.如何在向无法访问的主机发送UDP数据包时发现错误?
PS我的操作系统是Winodws 7 x64,我的应用程序是原生C++和64位.
我正在尝试学习如何使用Haskell通过HTTP/POST发送简单的字符串http-conduit(以便它也适用于https),从文件中读取目标URL,但对我来说似乎仍然有点压倒性.
基本上相当于我在这里学习使用Racket: 在Racket中发送HTTP POST
有人可以给我一个小的或最基本的例子吗?
post haskell functional-programming network-programming http
# cat /proc/net/udp | egrep "sl|3ADBFE0A"
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops
16: 3ADBFE0A:007B 00000000:0000 07 00000000:00000000 00:00000000 00000000 74 0 40124 2 f203ca80 0
509: 3ADBFE0A:0868 00000000:0000 07 00008C00:00000000 00:00000000 00000000 0 0 79208333 2 ea226340 0
Run Code Online (Sandbox Code Playgroud)
我想寻求更深入,更初学者友好的解释"cat proc/net/udp"输出的字段,尤其是tx_queue.如果我的理解是正确的,当这[tx_queue]值大于0时,意味着有更多的数据包等待发送,并且应用程序的速度不足以发送这些数据包?
在像bytes_read,err:= conn.Read(tmp)这样的语句中,我希望读取尝试x秒,如果没有读取开始,我希望代码继续检查一些连接并再次循环并尝试读取.我可以使用select-case并生成两个goroutine,一个尝试读取,另一个尝试超时.但是在这里,如果超时发生,首先代码将继续,检查条件并再次生成例程以尝试从连接读取而前面的读取例程仍然存活.我希望以前的例程在发生超时时死掉.
关于我如何进行的任何建议?
我正在使用菜单选项来连接到使用OpenFrameworks构建的C ++应用程序中的wifi。我想使用wpa_ctrl库,但无法编译。
程式码片段:
NetworkWrapper.h:
#ifndef NETWORKWRAPPER_H_
#define NETWORKWRAPPER_H_
class NetworkWrapper {
public:
NetworkWrapper():
private:
struct wpa_ctrl* m_ctrl;
};
#endif
Run Code Online (Sandbox Code Playgroud)
NetworkWrapper.cpp:
#include "NetworkWrapper.h"
extern "C" {
#include "wpa_ctrl.h"
}
NetworkWrapper::NetworkWrapper() {
m_ctrl = wpa_ctrl_open("wlan0");
}
Run Code Online (Sandbox Code Playgroud)
错误:
***/NetworkWrapper.cpp:7: undefined reference to `wpa_ctrl_open'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我试过抛出include并使用和不使用extern“ C”,但是看到wpa_ctrl.h也包含在extern“ C”标签中没有什么区别,尽管使用#ifdef __cplusplus(已定义,我将选中)。
我现在几乎没有主意了。我应该注意,我尝试将wpa_ctrl.c包含在外部的“ C”标记中,据我所知,不应将其编译(?)。这也给出了完全相同的结果。这导致我手动编译wpa_ctrl库并将其复制到obj目录,但再次出现:同样的结果。
感谢您抽出宝贵的时间阅读我的问题,希望对您有所帮助!
*编辑* 根据请求,我的链接选项(我将其修剪了一下):
g ++ -o bin / application_debug obj / linux64 / Debug / src / main.o [...] obj / linux64 / Debug / …
我试图用C编写一个非常基本的聊天客户端,该客户端使用套接字与另一台计算机通信,并且在理解select方面遇到一些问题。这是相关代码的简短片段。
while(1)
{
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_SET(STDIN, &writefds);
FD_SET(connectFD, &readfds);
select(connectFD+1, &readfds, &writefds, NULL, NULL);
if(FD_ISSET(connectFD, &readfds) != 0)
{
char buf[1024];
memset(buf, 0, sizeof(buf));
int lastBit;
lastBit = recv(connectFD, buf, sizeof(buf), 0);
if (lastBit > 0 && lastBit < 1024)
{
buf[lastBit] = '\0';
}
else
{
close(connectFD);
break;
}
printf("%s\n", buf);
}
else if (FD_ISSET(STDIN, &writefds))
{
char msg[1024];
memset(msg, 0, sizeof(msg));
read(STDIN, msg, sizeof(msg));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我要做的是在收到传入消息后立即对其进行处理,并且仅在按ENTER键后才发送传出消息,但是现在我只在按下ENTER键后才处理传入数据,而不是立即处理。我认为这是因为read是一个阻塞调用,并且当缓冲区中有任何数据时,select都将返回,不仅是当有换行符(read返回时),而且我也不知道如何处理它。有什么建议或提示可以引导我走上正确的道路吗?
非常感谢你们!