Tag: 套接字

struct addrinfo和struct sockaddr有什么区别

根据我的理解,struct addrinfo用于准备套接字地址结构,struct sockaddr包含套接字地址信息。 但这究竟意味着什么呢? struct addrinfo包含指向struct sockaddr的指针。 为什么要将它们分开? 为什么我们不能将sockaddr中的所有内容组合到addr_info中? 我只是在这里猜测,但他们分离的原因是为了在传递结构时节省空间? 例如,在bind()调用中,它需要的只是端口号和Internet地址。 所以这两个都分组在struct sockaddr中。 那么,我们可以传递这个小结构而不是更大的结构addrinfo? struct addrinfo { int ai_flags; // AI_PASSIVE, AI_CANONNAME, etc. int ai_family; // AF_INET, AF_INET6, AF_UNSPEC int ai_socktype; // SOCK_STREAM, SOCK_DGRAM int ai_protocol; // use 0 for “any” size_t ai_addrlen; // size of ai_addr in bytes struct sockaddr *ai_addr; // struct sockaddr_in […]

在C中的服务器和客户端应用程序中通过套接字发送和接收JSON

我想通过C语言编写的服务器 – 客户端应用程序中的套接字以JSON格式发送数据。 我使用json-c / libjson库来处理C应用程序中的JSON数据。 通过处理一些教程,我能够创建JSON对象并能够成功解析它。 现在我想使用JSON数据格式进行服务器客户端的通信。 这是我的服务器和客户端代码的一部分 server.c int main() { int listenfd = 0, connfd = 0; //related with the server struct sockaddr_in serv_addr; //json_object * jobj; uint8_t buf[158], i; memset(&buf, ‘0’, sizeof(buf)); listenfd = socket(AF_INET, SOCK_STREAM, 0); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(8888); bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); printf(“binding\n”); […]

如何从WSAGetLastError()中检索错误字符串?

我正在将一些套接字代码从Linux移植到Windows。 在Linux中,我可以使用strerror()将errno代码转换为人类可读的字符串。 MSDN文档显示了从WSAGetLastError()返回的每个错误代码的等效字符串,但我没有看到有关如何检索这些字符串的任何信息。 strerror()也会在这里工作吗? 如何从Winsock中检索人类可读的错误字符串?

跟踪数据包通过内核(linux)

我有两台机器设置为使用Ip-Security和机器A(让我们称之为A和B)有一个套接字,它绑定到本地机器上的特定UDP端口,并经常轮询它以查看是否有任何接收在上面。 当我禁用Ip-security时,两台机器之间的数据运行良好,我发送和接收数据包很好。 但是当启用Ip-Security时,数据包不会到达机器B发送的机器A上的那个套接字。 我在这两台机器上都做了一个tcpdump ,我可以看到(加密的)数据包从机器B发出并在机器A上接收。但是之后,数据包进入内核,在某个地方要么解密数据包,要么在某个其他阶段,数据包被丢弃。 我希望能够在数据包通过内核时跟踪数据包并查看它被丢弃的位置。 是否有一些/proc可以用于此目的? 我能想到的另一种方法是在整个内核中插入调试语句并重新编译它,然后再次尝试发送数据包并进行调试。 感谢和抱歉长信息,但这是必要的。

如何使用Python优雅地发送/接收大型C结构?

我已经开始编写Python 3.x客户端应用程序了。 服务器应用程序已经存在并用C语言编写。服务器提供了一个C头文件,其中包含两个用于通过UDP发送和接收数据的结构的定义(我正在使用Python的socket模块)。 问题是C结构非常大(每个大约200个元素)。 如果我使用Python的struct模块来打包/解包数据,那么一个不那么优雅的解决方案就是手动打包/解包200个元素,如: struct.pack(‘H…I’, data1, …, data200) 此外,我希望能够使用类似C的语法访问Python中的接收/发送元素。 例如,如果我在C服务器端 send.data.pos = pos; 如果我可以像这样访问Python客户端中的pos变量,那将是很好的(最自然的): pos = recv.data.pos 请注意,问题不在于如何从头文件中自动编写Python结构,就像在这个线程中一样(我在Python中逐个编写每个结构字段没有问题),而是什么是最好的组织方式Python中的数据(例如在类中,使用字典等),这将允许我利用Pythonfunction并使代码更简单,数据易于访问(我宁愿只使用Python标准模块,也不使用外部软件)。 实现这一目标最优雅的方法是什么?

如何比较C中的两个时间戳?

我正在编写一个套接字程序来维护两个输入套接字的FIFO队列。 在决定要服务的队列时,程序从每个队列中提取最新的时间戳。 我需要一种可靠的方法来比较两个时间结构。 我尝试使用timercmp() ,但我的gcc版本不支持它,并且文档声明该函数不符合POSIX。 我该怎么办?

C socket API是线程安全的吗?

我正在使用Linux和Win32套接字API。 在我的程序中,多个线程共享套接字句柄。 特别是,多个线程使用共享套接字句柄(即,相同的端口)调用send 。 在这种情况下,我是否必须锁定线程安全? 我无法找到答案。 我可以做一个测试,但想听听你的经历。 编辑 :我知道通过套接字发送数据根本不是primefaces操作。 当然,我们必须使用互斥锁来保证线程安全。 但是,我想知道系统API是否可以拥有自己的内部锁。 如果是这样,我们可以省略自己的锁定。 这个问题也可能适用于fprintffunction。 我想知道这样的系统API会有自己的锁。 根据我的经验,从多个线程调用fprintf并没有杀死我的程序,虽然文件或stdout上有比赛(即输出不一致或不可预测,但程序没有崩溃),这暗示fprintf有一个锁来保护他们的内部数据结构。

socket,检测连接丢失

我正在使用TCP连接连接服务器进程和客户端进程,我必须检测 两台机器之间的物理连接断开了。 我正在尝试使用keepalive, 将默认系统范围值减小为: TCP_KEEPIDLE = 5 TCP_KEEPCNT = 5 TCP_KEEPINTVL = 1 当连接断开(我断开电缆)时,只有服务器在10秒内检测到连接已丢失,客户端只挂起发送。 这是客户端代码: #include #include #include #include #include #include #include int main(int argc, char** argv) { char myVector[1600]; int mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (mySocket < 0 ) { std::cout << "error creating the socket" << strerror(errno) << std::endl; ::exit(-1); } struct […]

C socket:recv并发送所有数据

我想获得类似于此的行为: 服务器运行 客户端运行 客户端键入“帮助”或其他命令 服务器响应得当 去3 问题是,当我的函数excCommand(“help”)运行时,只接收并打印一个小文本。 我的文本文件是这样的: COMMAND HELP: help – Display help quit – Shutdown client 仅打印命令帮助。 另一个问题是,当我键入命令时,没有打印任何内容,并且在2命令客户端退出之后。 特别是这件作品: while (quit) { getLine(“client> “, command, 10); if (strcmp(command, “quit”) == 0) quit = 0; else excCommand(command); } 这是服务器: #include #include #include #include #include “common.h” int main(int argc, char *argv[]) { if (argc != […]

从TCP套接字接收数据包数据包?

我有一个tcp套接字,我接收video流。 我希望从socket接收数据包,以便我可以删除数据包标头并保留唯一的流数据。 我怎样才能做到这一点?? 任何帮助将不胜感激。