- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试为我之前发布的关于同步聊天消息的问题找到解决方案,一位成员向我指出了 select() 函数的方向。我读了this Beej 的网络指南下的部分,并尝试编写在 windows 下给出的示例。它编译正常,但当我去测试它时,程序崩溃并显示我的错误消息 "-Select error"
- 在将端口号输入程序后。我不确定如何让它工作,请指教。
服务器.cpp
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
using namespace std;
const int winsockver = 2;
int PORT;
int fdmax;
char buffer[80];
int main(void){
//*********************************************
fd_set master;
fd_set temp;
SOCKET newfd;
struct sockaddr_in connected_client;
//*********************************************
WSADATA wsadata;
if (WSAStartup(MAKEWORD(winsockver,0),&wsadata) == 0 ){
cout<<"-Winsock Initialized." << endl;
cout<<"Enter PORT:";
cin>> PORT;
//--------------------------------------------------------------------
struct sockaddr_in server_info;
server_info.sin_family = AF_INET;
server_info.sin_port = htons(PORT);
server_info.sin_addr.s_addr = INADDR_ANY;
SOCKET serv_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if ( serv_sock != INVALID_SOCKET){
if ( bind(serv_sock,(sockaddr*)&server_info,sizeof(server_info)) != -1 ){
char yes = '1';
if ( setsockopt(serv_sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) != SOCKET_ERROR){
cout<<"-Binding Successful." << endl;
}
}
if ( listen(serv_sock,5) != -1 ){
cout<<"-Listening for incoming connections." << endl;
}
FD_SET(serv_sock,&master);
fdmax = serv_sock; // keeping track of the largers sockfd, at this moment its serv_sock
//#########################################################
for(;;){
temp = master; // copying to temp the master set
if (select(fdmax+1,&temp,NULL,NULL,NULL) == -1 ){
cout<<"-select error." << endl;
}
//run through existing connections looking for data to read
for (int i = 0; i <= fdmax; i++){
if (FD_ISSET(i,&temp)){//we have one
if (i == serv_sock){//handle new connections
int size =sizeof(connected_client);
newfd = accept(serv_sock,(sockaddr*)&connected_client,&size);
if ( newfd == -1 ){
cout<<"-Accepted an invalid socket from newfd." << endl;
}else{//accept has returned a valid socket descriptor and we add it to the master
FD_SET(newfd,&master);
if (newfd > fdmax ){
fdmax = newfd;
}
char *connected_ip= inet_ntoa(connected_client.sin_addr);
cout<<"-Select server new connection from " << connected_ip << " " << endl;
}
}else{
//handle data from a client
int bytes_in;
bytes_in = recv(i,buffer,sizeof(buffer),0);
if ( bytes_in <= 0 ){
if (bytes_in == 0 ){
cout<<"-Connected socket " << i << ",disconnected " << endl;
}else{
cout<<"-Socket error." << endl;
}
closesocket(i);
FD_CLR(i,&master); //remove from master set.
}else{
//we get data from a client
for (int j=0; j <= fdmax; j++ ){
//send to everyone
if (FD_ISSET(j,&master)){
//except the listener and ourself
if ( (j != serv_sock) && (j != i) ){
if ( send(j,buffer,sizeof(buffer),0) == -1 ){
cout<<"-Sending error" << endl;
}
}
}
}
}
}
}
}
}
//#########################################################
}
//--------------------------------------------------------------------
}else{
cout<<"-Unable to Initialize." << endl;
}
if ( WSACleanup() != -1 ){
cout<<"-Cleanup Successful." << endl;
}
return 0;
}
最佳答案
您的文件描述符集未正确初始化,因此当您对它们调用 FD_SET()
时它们仍然包含垃圾。
你应该调用FD_ZERO()
在开始使用它们之前初始化它们:
FD_ZERO(&master);
FD_SET(serv_sock, &master);
fdmax = serv_sock;
关于c++ - winsock select()ing 运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4301760/
有没有人在 Windows 上使用 Winsock(不是 MSMQ)级别的 PGM 的经验?它看起来像是一个有用的可靠多播协议(protocol)(la TIBCO Rendezvous),我认为如果
我在 VS 2008 下使用 Winsock。 我有一个线程专门用于通过阻塞调用accept() 来接受传入的TCP 连接请求。当我的应用程序需要关闭时,我需要以某种方式解锁该线程,以便它可以执行关闭
在 KB4338830 更新后一段时间后,我们的应用程序突然持续卡住。不幸的是,应用程序无法重新启动也无法关闭,我怀疑这一切都是因为我正在使用的winsock(刚刚移植)。它是在vb.net上编写的,
我正在使用 Winsock API(不是 CAsyncSocket)来创建一个监听传入连接的套接字。 当有人尝试连接时,如何在接受连接之前获取他们的 IP 地址?我试图让它只接受来自某些 IP 地址的
服务质量 (QoS) 旨在管理带宽使用,这隐含地假设应用程序竞争该(有限)资源。这些天来,对于任何应用程序来说,这真的是一个问题吗? 它还假设 QoS 协议(protocol)和 Internet 协
我的项目使用 windows.h,其中使用了 winsock.h,我需要包含使用 winsock2 的 boost:assio。所以我收到很多错误,说 Winsock.h 已经包含在内。我可以定义 W
使用典型的 irc 客户端,我可以输入: /server localhost 6667 nick:pass 当我输入为 ZNC 配置的 nick:pass(IRC 保镖)时,我将被转发到在我的服务器/
我正在研究我面临的问题之一,与提出的问题类似 here .该问题基本上解决了客户端应用程序无法连接到数据库的问题。该解决方案似乎表明安装了与网络协议(protocol)不兼容的应用程序,我们应该卸载该
我一直在挠头,几个小时以来一直在寻找这个问题的答案。基本上我所做的就是打开一个到其他机器的套接字并从中读取数据。然后,通过传递表示套接字的 int 的 fdopen 调用,将该套接字“转换”为文件句柄
我在我的 VB6 应用程序中使用 winsock,这是我的代码: Private Sub Form_Load() With Winsock1 .Close .RemoteHo
我需要按照确定的顺序从客户端向服务器发送数据,服务器也可以按客户端发送的相同顺序接收这些数据。在下面的代码中,存在一个问题,即像下一个数据的数据一样接收数据(即控制字节 1 )。 前任: 在客户端上,
我正在开发客户端-服务器 Winsock 应用程序 (Visual C++),它应该通过网络传输各种数据(视频流、音频流、服务通知等)。我知道更简洁的方法是为每个单独的数据类型在单独的线程上使用单独的
我正在使用Microsoft Windows WinSock API拧小型HTTP服务器。 处理多个用户时是否需要应用多线程逻辑? 当前,Windows会在发生网络事件时发送一条消息,并且每条消息 (
对于我的项目,我无法调试程序,所以我无法确定为什么会出现此错误。 我的托管在 c# 上的服务器无法连接到本地主机上的服务器。 它没有向我的服务器发回“连接”信号,它永远不会连接,我认为代码写得很好,我
如何让 Winsock 程序只接受来自特定地址的连接请求?我希望被拒绝的连接被完全忽略,而不是得到 TCP 拒绝。 最佳答案 要使 Winsock 程序仅接受来自特定 IP 地址的连接,请使用 WSA
我写了一个数据包拦截器来转储来自winsock的send/recv函数的信息,据我所知,这两个函数都位于ws2_32.dll中;该钩子(Hook)是通过向一个函数写入一个 jmp 来完成的,该函数记录
我有一个简单的 winsock 程序,我想通过系统代理传递我的连接。我看到一些帖子解释了如何捕获系统代理然后发送如下字符串: CONNECT 127.0.0.1:8080 HTTP/1.0\r\n 等
我正在使用 tcp 套接字在 Windows XP 上的两个应用程序之间提供进程间通信。由于各种原因,我选择了 tcp 套接字。我看到平均往返时间为 2.8 毫秒。这比我预期的要慢得多。分析似乎表明延
我正在尝试在 Windows 下移植这个简单的 TCP echo 程序 ( https://github.com/mafintosh/echo-servers.c/blob/master/tcp-ec
过去两周我一直在学习 C,设法了解指针、数组和结构。 我想在 Windows 上进行一些套接字编程,想知道是否有人有任何提供教程和示例的网站,或者推荐一些使用 winsock 进行网络编程的书籍? 我
我是一名优秀的程序员,十分优秀!