这里讲述TCP网络应用程序C/S模式下的 Server 服务端的例子。
在visual C++ 创建一个 Win32 控制台应用程序——空项目
然后添加文件 …代码如下:
如果对变量不理解的,参考该文章:http://blog.tk-xiong.com/archives/576
客户端的例子是这样的 http://blog.tk-xiong.com/archives/588 ,个人推荐先看服务端。
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#include <Winsock2.h> #include <windows.h> #include <stdio.h> int main() { ////加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1 , 1 ); err = WSAStartup( wVersionRequested , &wsaData ); if(err != 0) { return 0; } if(LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1) { WSACleanup(); return 0; } //创建用于监听的套接字 SOCKET sockSrv = socket( AF_INET , SOCK_STREAM , 0 ); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = htonl( INADDR_ANY ); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons( 6000 ); //绑定套接字 bind( sockSrv , (SOCKADDR*)&addrSrv , sizeof( SOCKADDR ) ); //将套接字设置为监听模式,准备接受客户请求。 listen( sockSrv , 5 ); SOCKADDR_IN addrClient; int len = sizeof( SOCKADDR ); while(1) { //等待客户请求到来 SOCKET sockCoon = accept( sockSrv , (SOCKADDR*)&addrClient , &len ); char sendBuf[ 100 ]; sprintf( sendBuf , "Welcome %s to http://www.tk-xiong.com" , inet_ntoa( addrClient.sin_addr ) ); //发送数据 send( sockCoon , sendBuf , strlen( sendBuf ) + 1 , 0 ); char recvBuf[ 100 ]; //接收数据 recv( sockCoon , recvBuf , 100 , 0 ); //打印输出接受的数据 printf( "%s\n" , recvBuf ); //关闭套接字 closesocket( sockCoon ); } return 0; } |
这里对每一部分进行讲述:
头文件就不讲了…
1. 加载套接字库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
////加载套接字库 WORD wVersionRequested; //定义了使用的版本 WSADATA wsaData; //定义了获取版本信息的结构 int err; //通过该宏获取双字节值。 wVersionRequested = MAKEWORD( 1 , 1 ); //加载套接字库 err = WSAStartup( wVersionRequested , &wsaData ); //成功返回0,如果不成功,退出。 if(err != 0) { return 0; } //判断获取的版本,如果版本不对,释放资源,退出。 if(LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1) { WSACleanup(); return 0; } |
2. 创建用于监听的套接字
1 |
SOCKET sockSrv = socket( AF_INET , SOCK_STREAM , 0 ); |
参数不解释…SOCK_STREAM就是TCP…
3. 绑定
1 2 3 4 5 6 7 |
//绑定套接字 SOCKADDR_IN addrSrv; //定义数据结构... addrSrv.sin_addr.S_un.S_addr = htonl( INADDR_ANY ); //所有端口都可以监听 addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons( 6000 ); //端口号 bind( sockSrv , (SOCKADDR*)&addrSrv , sizeof( SOCKADDR ) ); |
注意这里的 htonl 函数,将一个整型转换为网络字节序。
4. 监听
1 2 |
//将套接字设置为监听模式,准备接受客户请求。 listen( sockSrv , 5 ); |
5. 接受客户请求
1 2 |
//等待客户请求到来 SOCKET sockCoon = accept( sockSrv , (SOCKADDR*)&addrClient , &len ); |
6. 发送-接受数据
1 2 3 4 5 6 7 8 9 |
//发送数据 char sendBuf[ 100 ]; sprintf( sendBuf , "Welcome %s to http://www.tk-xiong.com" , inet_ntoa( addrClient.sin_addr ) ); send( sockCoon , sendBuf , strlen( sendBuf ) + 1 , 0 ); //接收数据 char recvBuf[ 100 ]; recv( sockCoon , recvBuf , 100 , 0 ); |
7. 关闭套接字
1 2 |
//关闭套接字 closesocket( sockCoon ); |
和客户端通信玩之后,就关闭通信的套接字…
如有不懂的地方,看最前面的链接,里面讲了每一个函数的作用,这里是实际的应用。
【Socket】TCP网络应用程序-Server