如何用一个简单的winsocktcp服务器接受多个客户端
how to accept multiple clients with a simple winsock tcp server?
我不知道如何使用winsock为一个简单的tcp服务器接受多个连接。
我尝试了几种不同的方法,但我不知道如何获得另一种工作联系。对accept()的第一个调用似乎是唯一有效的调用。有人能提供一个简单的例子来说明如何做到这一点吗?或者在这里解释listen()和accept()是怎么回事?
#include <string>
#include <Winsock2.h>
WSADATA WsaData;
unsigned char packet_in[64];
unsigned short port = 29992;
unsigned int max_packet_size = sizeof(packet_in);
sockaddr_in xaddress;
SOCKET sock;
SOCKET sock1 = INVALID_SOCKET;
SOCKET sock2 = INVALID_SOCKET;
int main()
{
int r = WSAStartup( MAKEWORD(2,2), &WsaData );
xaddress.sin_family = AF_INET;
xaddress.sin_port = htons(port);
DWORD nonBlocking = 1;
sockaddr_in from;
int fromLength = sizeof( from );
int count = 0;
sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
r = bind(sock, (const sockaddr*) &xaddress, sizeof(sockaddr_in));
if (r != 0) printf("%dn", WSAGetLastError());
r = listen(sock, SOMAXCONN);
if (r == SOCKET_ERROR)
printf("%dn",WSAGetLastError());
ioctlsocket(sock, FIONBIO, &nonBlocking);
while(true)
{
if(count == 0)
{
sock1 = accept(sock, NULL, NULL);
}
else if (count == 1)
{
sock2 = accept(sock, NULL, NULL);
}
if(sock1 != INVALID_SOCKET)
count = 1;
if(sock2 != INVALID_SOCKET)
count = 2;
printf("%in",count);
}
return 0;
}
我不知道如何在Windows上进行网络编程,但它基本上看起来像在Linux上,所以这是Linux的一个小例子。
struct sockaddr_in server_addr
socklen_t len = sizeof(server_addr);
...
while(1)
{
struct sockaddr_in client_addr;
int client_fd;
if((client_fd = accept(server_sock, (struct sockaddr*)& client_addr, &len)) < 0)
{
cerr<<"accept() error"<<endl;
continue;
}
...
}
有一个完整的例子是用波兰语写的,但你应该明白:完整示例(查找//服务器.c)
Windows和Linux上的网络编程的主要区别在于结构和类,因此它应该会给您一些知识:Beej的网络编程指南
-
我认为从这个简单的程序中,你会得到更好的想法:)
// Multi-Client - Server chat application #include"header.h" void isr(int n) { printf("Client is Disconnected ..n"); kill(getpid(),9); return; } main() { int sockfd,nsfd,len,pid,size; char buffer[500],buffer1[500]; struct sockaddr_in server; /////////////////////////////////////////////////////////////////////// sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd==0) { printf("Socket file is not created socket is fail...n"); return; } //////////////////////////////////////////////////////////////////////// server.sin_family=AF_INET; server.sin_port=htons(9898); len = sizeof(server); ///////////////////////////////////////////////////////////////////// bind(sockfd,(struct sockaddr*)&server,len); perror("bind"); ///////////////////////////////////////////////////////////// listen(sockfd,5); perror("listen"); ///////////////////////////////////////////////////////////////// bzero(buffer,sizeof(buffer)); zero(buffer1,sizeof(buffer1)); ////////////////////////////////////////////////////////////////////// while(1) { nsfd=accept(sockfd,(struct sockaddr *)&server,&len); if(nsfd<0) { perror("accept"); return; } if(fork()==0) { while(1) { size=recv(nsfd,buffer,sizeof(buffer),0); if(size==0) { printf("Server is Disconnected...n"); return; } printf("Data:%sn",buffer); bzero(buffer,sizeof(buffer)); } } else { printf("Enter the massage:n"); signal(17,isr); while(1) { gets(buffer); send(nsfd,buffer,strlen(buffer)+1,0); bzero(buffer,sizeof(buffer)); } } } }
相关文章:
- C/C++ Linux 上的多线程服务器/客户端崩溃
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- ZMQ - 客户端服务器:客户端意外关闭,服务器如何检测到?
- C++服务器/客户端聊天程序
- Boost-Beast 异步 Web 套接字 服务器-客户端异步读写 不在控制台上写入输出
- 服务器客户端通过原始数据错误C 发送接收结构
- TCP 服务器/客户端:客户端 recv() 返回空白缓冲区
- 在使用 Poll() 的 TCP 服务器 - 客户端连接中,我是否需要手动设置事件?我从来没有到达 POLLOUT 来写
- 是否可以寻址另一个网络中的服务器/客户端套接字?(C++)
- 嗅探 QWebsocket 服务器 - 客户端通信
- C++(不是 C)中的示例服务器/客户端代码
- 如何将ZeroMQ用于多个服务器-客户端对
- 语言之间的服务器客户端首选项
- 服务器客户端程序上的QT-QFileSystemModel
- SFML网络服务器/客户端
- 服务器/客户端TCP异步(winsock)//FD_WRITE问题
- 基本服务器/客户端代码出现问题
- 将我的简单winsock服务器/客户端应用程序变形为简单的Web服务器
- C++ Winsock 服务器-客户端远程连接
- 修复:C++服务器/客户端程序:"Connection refused"