Tag: 套接字

使用有效的C代码将struct sockaddr *转换为struct sockaddr_in6 *的正确方法是什么?

这是一个简单的程序,它显示了在编写套接字程序时我们通常如何将struct sockaddr *类型struct sockaddr * struct sockaddr_in *或struct sockaddr_in6 * 。 #include #include #include #include #include #include int main() { struct addrinfo *ai; printf(“sizeof (struct sockaddr): %zu\n”, sizeof (struct sockaddr)); printf(“sizeof (struct sockaddr_in): %zu\n”, sizeof (struct sockaddr_in)); printf(“sizeof (struct sockaddr_in6): %zu\n”, sizeof (struct sockaddr_in6)); if (getaddrinfo(“localhost”, “http”, NULL, &ai) != 0) { printf(“error\n”); return EXIT_FAILURE; […]

套接字客户端使用Select

我试图实现一个客户端function,可以使用select()函数建立与多个服务器的连接。 但我不是使用select()函数的专家。 但是,我的客户端可以启用与多个服务器的连接,但它无法从这些多个服务器读取消息。 根据我的以下示例,我将我的客户端连接到两台服务器( 192.168.100.136, 192.168.100.138) 。 与这两台服务器连接后,我的客户端只从一台服务器( 192.168.100.136 )接收消息,而不是从多台服务器接收消息。 我不确定我在示例程序中使用select()函数的方式。 请更正我的示例应用程序以获得所需的o / p ..提前致谢 int main() { int port = 10001 ; char ip[][32] = {“192.168.100.136″,”192.168.100.138”}; int count = 2 ; int ret = clientSelect(ip,port,count); return 0 ; } int clientSelect(char **ipAddr ,int port , int count) { SOCKET max_sd = 0; SOCKET socketId[10] […]

通过套接字从Java发送到C – 奇怪的结果

我有一个用Java编写的简单服务器,它只是将一个Integer发送到一个连接的客户端。 我有一个用C编写的客户端,它连接到服务器并打印出收到的Integer。 我的问题是结果各不相同。 大约一半时间执行客户端我得到正确的结果(234),但有时我得到8323072。 这是服务器: class TCPServer { public static void main(String args[]) throws Exception { ServerSocket welcomeSocket = new ServerSocket(6789); while(true) { Socket connectionSocket = welcomeSocket.accept(); System.out.println(“welcomeSocket.accept() called”); DataInputStream inFromClient = new DataInputStream(connectionSocket.getInputStream()); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); outToClient.writeInt(234); } } } 这是客户: int main(int argc, char *argv[]) { if(argc != 4){ printUsage(); return; […]

使用epoll的多个UDP套接字 – 无法接收数据

我试图使用epoll从多个UDP套接字接收数据。 这是一个测试程序,它没有确切数量的套接字。(为了测试目的,它设置为50.)下面的程序没有收到任何数据,它被卡在epoll_wait(),因为我已经给它-1等待直到得到数据。 但是没有得到任何。 #include #include #include #include #include #include #include #include #include #include #define MAX_CON (50) typedef struct UDPMessage { unsigned short hdr; unsigned short CC1; unsigned short CC2; unsigned char data[1472]; unsigned short CC3; } UDPPacket; static struct epoll_event *events; int create_sockets(unsigned int port); int create_sockets(unsigned int port) { int sock, flag = 1; […]

sockaddr结构 – (sys / socket.h)

我整天都在读sys / socket.h ,最后开始理解它,现在开始使用它,但是,我不知道为什么我不能为sockaddr结构的sa_family成员赋值。 规格sockaddr结构: struct sockaddr{ sa_family_t sa_family address family char sa_data[] socket address (variable-length data) }; 数据类型: sa_family_t – 无符号整数类型(2-4个字节) 价值观: Name Purpose Man page AF_UNIX, AF_LOCAL Local communication unix(7) AF_INET IPv4 Internet protocols ip(7) AF_INET6 IPv6 Internet protocols ipv6(7) AF_IPX IPX – Novell protocols AF_NETLINK Kernel user interface device netlink(7) AF_X25 ITU-T […]

Linux:多个以太网端口上的TCP套接字编程

我一直在网上搜索我是如何使用C / C ++在linux中利用两个独立的以太网端口(例如eth0和eth1)编程的 我理解如何使用socket()和inet_pton,但这似乎只适用于单个以太网端口。 第一个以太网端口自动映射到192.168.0.100,第二个是192.168.0.101

在C:代理HTTP请求到另一台服务器

我正在尝试将HTTP请求代理到另一个HTTP服务器。 上游HTTP服务器的主机名和端口号分别为server_proxy_hostname和server_proxy_port。 第一步是对server_proxy_hostname进行DNS查找。 其次 ,我创建了一个网络套接字并将其连接到我从DNS获得的IP地址。 最后一步 :在两个套接字上等待新数据。 当数据到达时,我立即将其读取到缓冲区,然后将其写入另一个套接字。 这维持HTTP客户端和上游HTTP服务器之间的双向通信。 如果任何一个sockets关闭 ,我关闭另一个sockets 。 现在的问题是它无法正常工作。 (它超时) 我相信我获取IP地址的方式是正确的,所以问题必须是我的while循环(它永远不会终止?)或我调用connect()的部分。 我尝试为read()和select()添加错误终止,但这也不起作用。 void handle_proxy_request(int fd) { char * targetHostName = server_proxy_hostname; int targetPort = server_proxy_port; struct hostent *info; info = gethostbyname(targetHostName); struct in_addr ** ipAddresslist; ipAddresslist = (struct in_addr **) (info -> h_addr_list); struct in_addr * ipAddress = ipAddresslist[0]; printf(“ip address […]

在Linux / Mac / Windows上,是否可以在连接的TCP套接字的用户空间中访问TCP时间戳和/或RTT?

在Linux / Mac / Windows上,是否可以在连接的TCP套接字的用户空间中访问TCP时间戳和/或RTT? 我指的是RFC 1323启用的TCP时间戳和相关的RTT计算。 显然,我可以使用原始套接字,但套接字既不会连接也不能在Windows上发送TCP数据包(我相信XP Update 3之后)。

无法将Java客户端连接到C服务器

我有一个用C编写的非常简单的服务器和一个用Java编写的同样简单的客户端。 当我在同一台计算机上运行它们时,一切正常,但是当我尝试在计算机A和计算机B上的客户机上运行服务器时,我从java客户端收到错误IOException连接被拒绝 。 我似乎无法找出发生了什么,有什么想法吗? 我甚至关闭了防火墙,但问题仍然存在。 服务器。 #include #include #include #include #include #include #define PORT 3557 #define BUF 256 int main(int argc, char *argv[]) { struct sockaddr_in host, remote; int host_fd, remote_fd; int size = sizeof(struct sockaddr);; char data[BUF]; host.sin_family = AF_INET; host.sin_addr.s_addr = htonl(INADDR_ANY); host.sin_port = htons(PORT); memset(&host.sin_zero, 0, sizeof(host.sin_zero)); host_fd = socket(AF_INET, SOCK_STREAM, 0); […]

select()函数最后不允许printf()没有“\ n”

我使用select()时遇到问题:它在我的程序中表现得很奇怪,我无法理解为什么。 #include #include int main() { char msg[1024]; fd_set readfds; int stdi=fileno(stdin); FD_SET(stdi, &readfds); for (;;) { printf(“Input: “); select(stdi+1, &readfds, NULL, NULL, NULL); if (FD_ISSET(stdi, &readfds)) { scanf(“%s”,msg); printf(“OK\n”); } } } 你期望什么程序行为? 可能和我一样(123是我输入的字符串): Input: 123 OK 但真正的程序行为如下所示: 123 Input: OK 让我们将调用printf(“Input:”)中的争论更改为“Input:\ n”。 我们得到的是 Input: 123 OK 所以select()函数是冻结输出,直到下一个以“\ n”结尾的printf()。 我能做些什么才能得到我期望的行为?