已连接MultiClient服务器,但未正确接收消息 我必须用C++套接字创建一个基本的P2P连接,这意味着每个用户都有一个监听连接的服务器和一个连接的客户端,对吗?
现在我正在尝试创建一个主客户端,它有一个专用的服务器,也是一个客户端 这意味着在同一个程序中创建服务器和客户机,我使用了fork,它创建了服务器的子进程,父进程是客户机。现在,fork工作正常,我使用select检查套接字以读取数据,并在此基础上对服务器进行了建模 现在,当我运行该程序时,主客户机能够连接到自己的专用服务器,但是服务器并不总是接收消息。有时候,它收到了,有时候没有。知道为什么吗 另外,当第二个客户机连接到主客户机,并且它现在没有自己的服务器时,服务器显示它获得了一个新的连接,但是当我编写消息并发送它时,它不会从第二个客户机接收任何消息,但它有时会从主客户机接收消息,而不是总是这样 编辑:添加了cout.flush 编辑:我认为当客户机和服务器在同一个程序上运行时,分叉进程会导致一些延迟 更新:添加了新的服务器代码,该代码导致响应注释的消息延迟一次 这是密码 服务器代码已连接MultiClient服务器,但未正确接收消息 我必须用C++套接字创建一个基本的P2P连接,这意味着每个用户都有一个监听连接的服务器和一个连接的客户端,对吗?,c++,network-programming,C++,Network Programming,现在我正在尝试创建一个主客户端,它有一个专用的服务器,也是一个客户端 这意味着在同一个程序中创建服务器和客户机,我使用了fork,它创建了服务器的子进程,父进程是客户机。现在,fork工作正常,我使用select检查套接字以读取数据,并在此基础上对服务器进行了建模 现在,当我运行该程序时,主客户机能够连接到自己的专用服务器,但是服务器并不总是接收消息。有时候,它收到了,有时候没有。知道为什么吗 另外,当第二个客户机连接到主客户机,并且它现在没有自己的服务器时,服务器显示它获得了一个新的连接,但是
while (1) {
unsigned int s;
readsocks = socks;
if (select(maxsock + 1, &readsocks, NULL, NULL, NULL) == -1) {
perror("select");
return ;
}
for (s = 0; s <= maxsock; s++) {
if (FD_ISSET(s, &readsocks)) {
//printf("socket %d was ready\n", s);
if (s == sock) {
/* New connection */
cout<<"\n New Connection";
cout.flush();
int newsock;
struct sockaddr_in their_addr;
socklen_t size = sizeof(their_addr);
newsock = accept(sock, (struct sockaddr*)&their_addr, &size);
if (newsock == -1) {
perror("accept");
}
else {
printf("Got a connection from %s on port %d\n",
inet_ntoa(their_addr.sin_addr), htons(their_addr.sin_port));
FD_SET(newsock, &socks);
if (newsock > maxsock) {
maxsock = newsock;
}
}
}
else {
/* Handle read or disconnection */
handle(s, &socks);
}
}
}
}
void handle(int newsock, fd_set *set)
{
char buf[256];
bzero(buf, 256);
/* send(), recv(), close() */
if(read(newsock, buf, 256)<=0){
cout<<"\n No data";
FD_CLR(newsock, set);
cout.flush();
}
else {
string temp(buf);
cout<<"\n Server: "<<temp;
cout.flush();
}
/* Call FD_CLR(newsock, set) on disconnection */
}
这可能只是因为您在这一行之后没有刷新:cout@DavidSchwartz我试过cout.flush,但没用,我用printf代替cout。同样的问题仍然存在。我的主要问题是为什么第二个客户端无法向服务器发送任何消息,为什么第一个客户端不总是发送数据。这和select的延迟有什么关系吗?你能告诉我你把冲水放在哪里了吗?@DavidSchwartz我把它放在了你提到的地方。@DavidSchwartz我觉得select有点延迟或什么的。while循环似乎在中途暂停,在从客户端发送几条消息后,服务器能够打印最后发送的消息,而之前的消息将丢失。