我必须使用c ++套接字创建一个基本的p2p连接,这意味着每个用户都有一个用于监听连接的服务器和一个用于连接的客户端,对吧?
目前我正在尝试创建一个拥有专用服务器且客户端的主客户端。
这意味着在同一个程序中创建服务器和客户端,我使用fork()创建服务器的子进程,父进程是客户端。现在,fork工作正常,我使用select()来检查套接字是否读取数据,我已经在http://beej.us/guide/bgnet/output/html/multipage/advanced.html#select
上对服务器进行了建模现在,当我运行程序时,主客户端能够连接到自己的专用服务器,但服务器始终不会收到这些消息。有时,它接收它,有时它不会。知道为什么吗?
此外,当第二个客户端连接到主客户端,并且它现在没有它自己的服务器时,服务器会显示它获得新连接,但是当我写入消息时并且发送它,它没有收到来自第二个客户端的任何消息,但是它有时并且不总是从主客户端接收消息。
编辑:添加了cout.flush
编辑:我认为当客户端和服务器在同一个程序上运行时,分支过程会导致一些延迟。
更新:添加了新服务器代码,导致一条消息延迟(响应评论) 这是代码。
服务器代码
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 */
}