网络编程简单例子

基于TCP的C/S简单通信

之前看《VC深入详解》的时候就看过这样的例子,也在VC6.0下写过简单的C/S通信,今天看网络编程视频,在VS2008下在练习了一次。

所谓的通信简单来说就是双方socket的通信,服务器的监听socket用来监听客户端的连接请求,客户端的connect到来时,用accept后的socket进行通信。简单来说就是:

监听->连接->接受->双方通信。

具体的代码如下:

服务器端:
#include "stdafx.h"
#include "WinSock2.h"
#include "stdio.h"
#pragma comment(lib,"Ws2_32.lib")//导入库,lib表示库," "表示库的名称

int _tmain(int argc, _TCHAR* argv[])
{
	//加载WinSock库
	WORD wVersionRequested;
	WSADATA wsaData;
    int err;

	wVersionRequested = MAKEWORD( 2, 2 );

	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 )
		return 0;
	if ( LOBYTE( wsaData.wVersion ) != 2 ||
		HIBYTE( wsaData.wVersion ) != 2 ) {
			WSACleanup( );
			return 0; 
  }

	SOCKET lSocket,aSocket;
	SOCKADDR_IN AddrSer;
	AddrSer.sin_family=AF_INET;
	AddrSer.sin_port=htons(5000);
	AddrSer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//INADDR_ANY表示接受任何机器的请求
	lSocket=socket(AF_INET,SOCK_STREAM,0);
	//绑定服务器地址
	if(::bind(lSocket,(SOCKADDR*)&AddrSer,sizeof(SOCKADDR))==SOCKET_ERROR)
	{
		printf("绑定套接字失败");
		return 0;
	}
	::listen(lSocket,1);//开始监听客户端的连接请求
    SOCKADDR_IN AddrCli;//客户端的地址信息
	int len=sizeof(SOCKADDR);
	aSocket=::accept(lSocket,(SOCKADDR*)&AddrCli,&len);//连接成功时,产生新的socket用来与客户端通信
	char recBuf[1024];
	char senBuf[1024];
	while (1)
	{
		//TCP下为recv与send,UDP下为recefrom与sendto
		::recv(aSocket,recBuf,1024,0);
		if (recBuf[0]=='#')
		{
			printf("客户端请求断开
");
			printf("正在断开...");
			Sleep(3000);
			break;
		}
		printf("客户端:%s
",recBuf);
		printf("服务器:");
		gets_s(senBuf);//warming:gets()is unsafe
		if (senBuf[0]=='#')
		{
			::send(aSocket,senBuf,1024,0);
			printf("正在请求断开...
");
			Sleep(3000);
			return 0;
		}
		//printf("服务器:%s
",senBuf);
		::send(aSocket,senBuf,1024,0);
		memset(recBuf,' ',1024);
		memset(senBuf,' ',1024);
	}
	::closesocket(aSocket);
	::closesocket(lSocket);
	::WSACleanup();
	return 0;
}
客户端:
#include "stdafx.h"
#include "WinSock2.h"
#include "stdio.h"
#pragma comment(lib,"Ws2_32.lib")

int _tmain(int argc, _TCHAR* argv[])
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD( 2, 2 );

	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 )
		return 0;
	if ( LOBYTE( wsaData.wVersion ) != 2 ||
		HIBYTE( wsaData.wVersion ) != 2 ) {
			WSACleanup( );
			return 0; 
	}

	SOCKET cSocket;
	cSocket=socket(AF_INET,SOCK_STREAM,0);
	SOCKADDR_IN addrSer;
	addrSer.sin_family=AF_INET;
	addrSer.sin_port=htons(5000);
	addrSer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
	if(::connect(cSocket,(SOCKADDR*)&addrSer,sizeof(SOCKADDR))==SOCKET_ERROR)
	{
		printf("连接服务器失败");
		return 0; 
	}
	char senBuf[1024];
	char recBuf[1024];
	while(1)
	{	
		printf("客户端:");
		gets_s(senBuf);
		if (senBuf[0]=='#')
		{
			::send(cSocket,senBuf,1024,0);
			printf("正在请求断开...
");
			Sleep(3000);
			return 0;
		}
		//printf("客户端:%s
",senBuf);
		::send(cSocket,senBuf,1024,0);
		::recv(cSocket,recBuf,1024,0);
		if(recBuf[0]=='#')
		{
			printf("与服务器断开");
			printf("正在断开...");
			Sleep(3000);
			break;
		}
		printf("服务器:%s
",recBuf);
		memset(recBuf,' ',1024);
		memset(senBuf,' ',1024);
	}
	::closesocket(cSocket);
	::WSACleanup();
	return 0;
}

之前用的比较多的是6.0,用VS起来还有点不熟。有一些地方要注意,在VC导入Ws2_32.lib库在项目LINK添加就可以了,在VS下是如何这样做的呢?另外在VS使用gets()函数都会出现警告,说是unsafe,也就是怕溢出,相应的有gets_s()函数来接受输入。我把VS2008的字体改成像VC6.0一样后,在编写的时候行头总会出现一些中文或乱码,但是过一会就消失,也不会出错,不知道怎么回事。希望有同样类似情况的朋友告诉我一下。

以上实现的只是最简单的TCP通信,基于UDP的就更简单。最近买了网络编程实例的书,期待以后更深入的学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值