这里讲述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
				
					