Tag: winsock

Winsock – 为什么ZNC(和IRC保镖)不接受我的winsock连接?

使用典型的irc客户端我可以输入: /server localhost 6667 nick:pass 当我输入缺口:通过我配置为ZNC,(一个IRC保镖)我转发到znc连接到我的服务器/ nick:pass组合下的服务器。 如何以编程方式同时打开所有这些参数的winsock连接? /server localhost 6667 nick:pass 我尝试在连接后发送数据,但znc似乎忽略了请求。 或者我根本就没有连接到它。 此代码已连接到不需要Ping身份validation的IRC服务器,因此我知道它可以正常工作。 #define AF_INET 2 #define SOCK_STREAM 1 #define SOL_SOCKET 0xffff #define SO_SNDTIMEO 0x1005 string server_addr = “127.0.0.1”; int server_port = 6667; void ircconnect(){ int struct_sockaddr[4]; int addr, port_low, port_high; int opts[1]; int c; if (irc_disabled == 1) return(0); // fill the […]

退出阻塞的recv()调用

我想退出阻塞的recv()调用。 基于这个问题 ,我应该做到以下几点: shutdown(s, SD_RECEIVE); 但它不起作用, recv()仍在阻塞! 编辑: 这是我使用的代码: #include #include #include #include #pragma comment(lib, “ws2_32.lib”) unsigned int __stdcall recvThread(void *p) { SOCKET s = *((SOCKET*)p); char buffer[2048]; int size; do { size = recv(s, buffer, 2048, 0); if (size > 0) { printf(“Some data received\n”); } else if (size == 0) { printf(“Disconnected\n”); } […]

为什么inet_ntoa和inet_ntop“反转”字节?

这是一个相当基本的问题,令我惊讶的是,我今天遇到了一个问题。 它看起来像inet_pton和inet_ntoa正在反转他们给出的IP地址的字节: DWORD IP; inet_pton(AF_INET, “192.168.0.1”, &IP); printf(“%08X\n”, IP); 这将打印0100A8C0 。 好吧,如果我们分解字节,它是01.00.A8.C0 = 1.0.168.192 。 同理: IP = 0x7F000001; struct in_addr ia; ia.S_un.S_addr = IP; printf(“%s\n”, inet_ntoa(ia)); 给了我1.0.0.127 。 首先想到的是endianness,但我已经阅读了MSDN文档( 1和2 )并且没有提到字节顺序; 这对我来说似乎很奇怪,这些函数会随意决定使用其中一种符号而没有明确说明。 到底是怎么回事?

为什么我的socket的开放端口没有被netstat列出?

如果您运行此示例,您将看到netstat从未列出该端口。 为什么? 我怎么做到这一点? #include #include #include #pragma comment(lib, “WS2_32”) int main() { WORD wVers = MAKEWORD(2, 2); WSADATA wsa; WSAStartup(wVers, &wsa); SOCKET sock = socket(AF_INET, SOCK_STREAM, 6); if (sock != INVALID_SOCKET) { struct sockaddr_in addr = { 0 }; addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); int addrlen = sizeof(addr); bind(sock, (struct sockaddr *)&addr, addrlen); if […]

如何在套接字编程中发送长度大于缓冲区的消息?

我正在使用C ++中的Winsock开发一个应用程序。 我有一个200字节长的char数组,用于通过套接字发送字符串。 我的问题是当发送大于char数组的消息时,所以我决定以多个块发送它们,但我不知道该怎么做。 为了发送和接收数据,我使用常规的send()和recv()函数: recv(client, buffer, 200, NULL); send(client, buffer, 200, NULL); 更新 我有一个结构: struct Pack { unsigned int senderId; char str[200]; } 在发送之前我将struct转换为char数组。 Pack pk; strcpy_s(pk.str, 200, “Some text to send.\0”); pk.senderId = 1 // user id char *buffer = (char*)pk; 如果字符串大小如果大于200则strcpy_s()崩溃。

适用于C的HTTP POST / GET的轻量级库?

我打算为Windows中的音乐播放器创建一个Last.FM scrobbler插件。 Last.FM提交API在HTTP / 1.1 GET和POST上进行中继。 我从来没有完成面向Internet的编程,我仍然知道HTTP协议,但我想开始玩它发送和获取一些数据。 我看过Winsock界面,但我不知道使用任何更简单的东西是否更好。 你们中的任何人都知道我该怎么办? 我能用什么? 如果是这样,你能指点我一个教程吗? 如果它是一个库,我可以静态链接它,我想只提供插件的DLL。

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

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

WSAStartup函数如何启动Winsock DLL的使用?

WSAStartup函数如何启动Winsock DLL的使用? 根据文件 WSAStartup函数必须是应用程序或DLL调用的第一个Windows套接字函数。 它允许应用程序或DLL指定所需的Windows套接字版本,并检索特定Windows套接字实现的详细信息。 应用程序或DLL只能在成功调用WSAStartup后发出更多Windows套接字函数。 这个函数初始化WSADATA数据结构,但是在套接字编程中我们不会将WSDATA传递给任何函数,那么程序如何了解Windows套接字版本和其他细节呢? 例如,在此代码中 #include #include #pragma comment(lib, “ws2_32”) void Run(int argc, char* argv[]) { char* host = argc h_addr; printf(“IP Address: %s\n”, inet_ntoa(*addr)); } else printf(“ERROR: Resolution failure.\n”); } int main(int argc, char* argv[]) { WSADATA wsaData; if(WSAStartup(0x202, &wsaData) == 0) { Run(argc, argv); WSACleanup(); } else printf(“ERROR: Initialization failure.\n”); […]

如何中止winsock阻塞调用?

我在C ++中使用Winsock 2,并想知道如何使我的服务器停止从客户端连接读取。 阅读线程在recv()被阻止,我不知道如何中止它。 一种方法是使用带有select()的非阻塞套接字,但是这个线程必须在检查新的select()之前等待。 什么是停止读取sockets的正确方法?

中断接受()

是否有OS可移植的方式来中断阻塞accept ? 我有一个multithreadingdeamon /服务,当deamon / service获得关闭信号时,需要正常关闭所有侦听网络主机。 我看到有人说你应该使用非阻塞套接字或选择超时 – 但这些会不会降低性能,因为我的应用程序应尽可能快? 守护进程在主线程中运行,而每个侦听网络主机都在自己的线程中运行。 现在的问题是,如果侦听网络主机的套接字上没有网络流量,则accept无限期等待。 如果我应该使用信号,那么有一个使用信号来中断accept的例子吗?