VC++之网络编程三 TCP编程实例

转自:http://blog.csdn.net/thinkscape/article/details/4037476

注释参考:http://blog.163.com/163_dhbing/blog/static/117387803200942242433217/

Server:

#include <Winsock2.h>
#include <stdio.h>
#include <iostream>
using namespace std;
void main()
{
	//mide delete word
	
	WORD wVersionRequested;  //准备加载Winsock库的版本,注意高字节是副版本号
	WSADATA wsaData; //是一个返回值,指向WSADATA结构的指针,WSAStartup函数将其加载的库版本信息输入到这个结构体中。
	int err;
	wVersionRequested=MAKEWORD(2,2);
	
	err=WSAStartup(wVersionRequested,&wsaData);
	if(err!=0){   
		return;
	}
	if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wHighVersion)!=2)/*如果加载的版本不正确,返回。需要注意的是高字节是副版本号,低字节是主版本号*/
	{
		WSACleanup();
		return ;
	}
	
	SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
	/*socket(int af,int type,int protocol);    //socket 函数三个参数af,指定地址族,对于TCP/IP协议套接字,它只能是AF_INET;type参数指定Socket类型,对于1.1版本的Socket,它只支持两种类型的套接字,SOCK_STREAM指定产生流失套接字,SOCK_DGRAM产生数据报套接字;protocol是与特定的地址家族相关的协议,如果指定为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));
	/*s为指定要绑定的套接字;name指定了该套接字的本地地址信息,这是一个指向sockaddr结构的指针变量,该地址结构是为所有的地址家族准备的,这个结构可能随时用的网络协议不同而不同,所以才需要第三个参数namelen指定该地址结构的长度。*/
	listen(sockSrv,5);
	/*// int listen(SOCKET s,int backlog); s是Socket不用说,backlog是等待队列的最大长度,比如现在设为2,那么假如同时有3个请求来到服务器端的时候,就把前两个放到请求队列中,第三个就会被拒绝。*/
	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);
	
	while(1)
	{
		SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);/*//建立连接,返回对应于此次连接的SOCKET*/
		char sendBuf[100];//发送数据的buff
		sprintf(sendBuf,"welcome %s to my space",inet_ntoa(addrClient.sin_addr));//格式化客户端地址
		send(sockConn,sendBuf,strlen(sendBuf)+1,0);  //发送的字节多一个,最后一个是空,结束!
		char recvBuf[100];//接收数据的buff
		recv(sockConn,recvBuf,100,0);//接收数据
		printf("%s/n",recvBuf);
		
		closesocket(sockConn);//关闭连接
	}
}

Client:

#include <Winsock2.h>
#include <stdio.h>
#include <iostream>
using namespace std;
void main(){
	//mide delete word
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested=MAKEWORD(2,2);
	err=WSAStartup(wVersionRequested,&wsaData);
	if(err!=0){
		return;
	}
	if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wHighVersion)!=2)
	{
		WSACleanup();
		return ;
	}
	SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(6000);
	connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	char recvBuf[100];
	recv(sockClient,recvBuf,100,0);
	printf("%s/n",recvBuf);
	
	send(sockClient,"This is wangwu",strlen("This is wangwu")+1,0);
	closesocket(sockClient);
	WSACleanup();
}

注意:

server 和 client 都要"项目属性"--->"配置属性"----> "链接"----> "输入" --->"附加依赖项"中添加"ws2_32.lib"  

(Leytton:ws2_32.lib不行则加入WSOCK32.lib)

posted @ 2014-07-12 20:48  Leytton  阅读(397)  评论(0编辑  收藏  举报