Start 方法用来开始侦听传入的连接请求。Start 将对传入连接进行排队,直至您调用 Stop 方法或它已经完成 MaxConnections 排队为止。可使用 AcceptSocket 或 AcceptTcpClient 从传入连接请求队列提取连接。这两种方法将阻止。如果要避免阻止,可首先使用 Pending 方法来确定队列中是否有可用的连接请求。
TCPClient: TcpClient 为 TCP 网络服务提供客户端连接。 TcpClient 类提供了一些简单的方法,用于在同步阻塞模式下通过网络来连接、发送和接收流数据。 为使 TcpClient 连接并交换数据,使用 TCP ProtocolType 创建的 TcpListener 或 Socket 必须侦听是否有传入的连接请求。可以使用下面两种方法之一连接到该侦听器: 创建一个 TcpClient,并调用三个可用的 Connect 方法之一。 使用远程主机的主机名和端口号创建 TcpClient。此构造函数将自动尝试一个连接。 注意 如果要在同步阻塞模式下发送无连接数据报,请使用 UdpClient 类。 对继承者的说明: 要发送和接收数据,请使用 GetStream 方法来获取一个 NetworkStream。调用 NetworkStream 的 Write 和 Read 方法与远程主机之间发送和接收数据。使用 Close 方法释放与 TcpClient 关联的所有资源。
代码实现:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> void Usage(char *name) { printf("Usage:%s[ipAddress][port]\n",name); } int StartUp(const char* _ip,int _port) { int sock = socket(AF_INET,SOCK_STREAM,0); if(sock<0) { perror("socket"); exit(2); } struct sockaddr_in local; local.sin_family = AF_INET; local.sin_port= htons(_port); local.sin_addr.s_addr = inet_addr(_ip); if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0) { perror("listen"); exit(4); } return sock; } int main(int argc,char* argv[]) { if(argc!=3) { Usage(argv[0]); return 1; } int listen_sock=StartUp(argv[1],atoi(argv[2])); while(1) { struct sockaddr_in client; socklen_t len=sizeof(client); char cli_ip[INET_ADDRSTRLEN]=""; int new_sock=accept(listen_sock,(struct sockaddr *)&client,&len); if(new_sock<0) { perror("accept"); continue; } inet_ntop(AF_INET,&client.sin_addr,cli_ip,INET_ADDRSTRLEN); printf("get new client:ip->%s,port->%d\n",cli_ip,ntohs(ntohs(client.sin_port))); char buf[1024]; while(1) { ssize_t s=read(new_sock,buf,sizeof(buf)-1); if(s>0) { buf[s]=0; printf("client# %s\n",buf); write(new_sock,buf,strlen(buf)); } else if(s==0) { printf("client 关闭\n"); break; } else { perror("read"); break; } } close(new_sock); } return 0; }