#基于TCP的网络聊天程序

 

本实例是基于TCP的网络聊天程序,根据有关TCP的套接字socket编程中服务器的设计过程,编写的代码。

新建工程->新建文件->新建项

#include<stdio.h>
#include<winsock.h>		/*引入winsock头文件*/

int  main()
{
	/*-----------------------------------------*/
	/*------------定义变量---------------------*/
	/*-----------------------------------------*/
	char Sendbuf[100];		/*发送数据的缓冲区*/
	char Receivebuf[100];	/*接受数据的缓冲区*/
	int SendLen;			/*发送数据的长度*/
	int	ReceiveLen;			/*接收数据的长度*/
	int Length;				/*表示SOCKADDR的大小*/

	SOCKET socket_server;	/*定义服务器套接字*/
	SOCKET socket_receive;  /*定义用于连接套接字*/

	SOCKADDR_IN Server_add;	/*服务器地址信息结构*/
	SOCKADDR_IN Client_add;	/*客户端地址信息结构*/

	WORD wVersionRequested;	/*字(word):unsigned short*/
	WSADATA wsaData;		/*库版本信息结构*/
	int error;				/*表示错误*/

	/*-----------------------------------------*/
	/*------------初始化套接字库---------------*/
	/*-----------------------------------------*/
	/*定义版本类型。将两个字节组合成一个字,前面是第字节,后面是高字节*/
	wVersionRequested = MAKEWORD( 2, 2 );	
	/*加载套接字库,初始化Ws2_32.dll动态链接库*/
	error = WSAStartup( wVersionRequested, &wsaData);	
	if(error!=0)
	{
		printf("加载套接字失败!");
		return 0;	/*程序结束*/
	}
	/*判断请求加载的版本号是否符合要求*/
	if ( LOBYTE( wsaData.wVersion ) != 2 ||
		   HIBYTE( wsaData.wVersion ) != 2 ) 
	{	
		WSACleanup( );	/*不符合,关闭套接字库*/
		return 0;		/*程序结束*/
	}

	/*-----------------------------------------*/
	/*------------设置连接地址-----------------*/
	/*-----------------------------------------*/
	Server_add.sin_family=AF_INET;/*地址家族,对于必须是AF_INET,注意只有它不是网络网络字节顺序*/
	Server_add.sin_addr.S_un.S_addr=htonl(INADDR_ANY);/*主机地址*/
	Server_add.sin_port=htons(5000);/*端口号*/

	/*------------创建套接字-------------------*/
	/*AF_INET表示指定地址族,SOCK_STREAM表示流式套接字TCP,特定的地址家族相关的协议。*/
	socket_server=socket(AF_INET,SOCK_STREAM,0);

	/*-----------------------------------------*/
	/*---绑定套接字到本地的某个地址和端口上----*/
	/*-----------------------------------------*/
			/*socket_server为套接字,(SOCKADDR*)&Server_add为服务器地址*/
	if(bind(socket_server,(SOCKADDR*)&Server_add,sizeof(SOCKADDR) )==SOCKET_ERROR)
	{
		printf("绑定失败\n");
	}

	/*-----------------------------------------*/
	/*------------设置套接字为监听状态---------*/
	/*-----------------------------------------*/
		/*监听状态,为连接做准备,最大等待的数目为5*/
	if(listen(socket_server,5)<0)
	{
		printf("监听失败\n");
	}
	
	/*-----------------------------------------*/
	/*------------接受连接---------------------*/
	/*-----------------------------------------*/
	Length=sizeof(SOCKADDR);
	/*接受客户端的发送请求,等待客户端发送connect请求*/
	socket_receive=accept(socket_server,(SOCKADDR*)&Client_add,&Length);
	if(socket_receive==SOCKET_ERROR)
	{
		printf("接受连接失败");
	}

	/*-----------------------------------------*/
	/*--------------进行聊天-------------------*/
	/*-----------------------------------------*/
	while(1)						/*无限循环*/
	{	
		
		/*--------接收数据---------*/
		ReceiveLen =recv(socket_receive,Receivebuf,100,0);
		if(ReceiveLen<0)
		{
			printf("接收失败\n");
			printf("程序退出\n");
			break;
		}
		else
		{
			printf("client say: %s\n",Receivebuf);
		}	
		
		/*--------发送数据---------*/
		printf("please enter message:");
		scanf("%s",Sendbuf);
		SendLen=send(socket_receive,Sendbuf,100,0);
		if(SendLen<0)
		{
			printf("发送失败\n");
		}
	}

	/*-----------------------------------------*/
	/*---------释放套接字,关闭动态库----------*/
	/*-----------------------------------------*/
	closesocket(socket_receive);	/*释放客户端的套接字资源*/
	closesocket(socket_server);/*释放套接字资源*/
	WSACleanup();/*关闭动态链接库*/
	return 0;
}

注意:

在运行程序之前,要添加相应的库文件ws2_32.lib

以上就是有关服务器端的代码。整个程序流程按照以下顺序编写:

(1)创建套接字

(2)绑定套接字到本地的地址和端口上

(3)设置套接字为监听状态

(4)接受请求连接的请求

(5)进行通信

(6)通信完毕,释放套接字资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@@@皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值