Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
首先解释下socket含义。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。
下面我列举几个常用的服务端TCP socket实现代码
1、首先是最原始的阻塞模型。这种模型简单易懂,[以下代码基于Windows]:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <winsock2 .h> #pragma comment(lib, "ws2_32.lib") int mian (int argc, char* argv []) { //Winsock环境初始化 WSAData wd; WSAStartup (MAKEWORD (2, 2), &wd); //创建套接字 SOCKET sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);//对于UDP协议,第二个参数填 SOCK_DGRAM //绑定前的操作,UDP可以不用绑定 sockaddr_in addr; addr.sin_family = AF_INET;//需要绑定的本地地址 addr.sin_addr.s_addr = 0; addr.sin_port = htons (51423);//需要绑定的本地端口 //执行绑定 bind (sock, (struct sockaddr*)&addr, sizeof (addr)); //监听 listen (sock, SOMAXCONN); while (true) { //如果有链接请求,则接受链接 SOCKET session = accept (sock, NULL, NULL); if (INVALID_SOCKET == session) break; //接收数据 char buf [1024]; int len = recv (session, buf, sizeof (buf), 0); //发送数据 send (session, buf, len, 0); //关闭链接 closesocket (session); } //关闭套接字 closesocket (sock); //Winsock环境释放 WSACleanup (); return 0; }</winsock2> |