【Linux】中TCP_server的实现

来源:互联网 发布:北京匡恩网络拖欠工资 编辑:程序博客网 时间:2024/06/07 22:09
TCP 网络客户端侦听连接。
可使用 TcpClient 或 Socket 来连接 TcpListener。可使用 IPEndPoint、本地 IP 地址及端口号或者仅使用端口号,来创建 TcpListener。可以将本地 IP 地址指定为 Any,将本地端口号指定为 0(如果希望基础服务提供程序为您分配这些值)。如果您选择这样做,可在连接套接字后使用 LocalEndpoint 属性来标识已指定的信息。

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;}




原创粉丝点击