基于Udp的Socket网络编程聊天程序

分享到:

1.新建一个工程区Net

在工作区中添加两个工程 NetSrv 和 NetClient

为两个工程添加库文件 (Link中) ws2_32.lib

2.在工程NetSrv中添加Server.cpp文件

代码如下:

#include <WINSOCK2.H>
#include <stdio.h>
void main()
{
	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.wVersion ) != 2 )
{
WSACleanup( );
return;
}
SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,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));
char recvBuf[100];
	char sendBuf[100];
	char tempBuf[200];
SOCKADDR_IN addrClient;
	int len = sizeof(SOCKADDR);
while (1)
	{
recvfrom(sockSrv , recvBuf, 100, 0, (SOCKADDR*)&addrClient,&len);
if ('q'==recvBuf[0])
{
sendto(sockSrv,"q",strlen("q")+1, 0 , (SOCKADDR*)&addrClient,len);
printf("Chat end!\n");
break;
}
sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf);
printf("%s\n",tempBuf);
printf("Please input data:\n");
gets(sendBuf);
sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len);
	}
	closesocket(sockSrv);
	WSACleanup();
}

3.在工程NetClient中添加Client.cpp文件 代码如下:
#include <WINSOCK2.H>
#include <stdio.h>
void main()
{
	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.wVersion ) != 2 )
{
WSACleanup();
return;
}
SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,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);
char recvBuf[100];
	char sendBuf[100];
	char tempBuf[200];
int len = sizeof(SOCKADDR);
while (1)
	{
printf("Please input data:\n");
gets(sendBuf);
sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);
recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len);
if ('q' == recvBuf[0])
{
sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrSrv,len);
printf("Chat end!\n");
break;
}
sprintf(tempBuf,"%s say : %s",inet_ntoa(addrSrv.sin_addr),recvBuf);
printf("%s\n",tempBuf);
	}
	closesocket(sockClient);
	WSACleanup();
}

4.先运行服务端程序,再运行客户端程序

可以聊天了,但是只能客户端发一句,服务端发一句,比较呆板

昵    称:
验证码:

相关文档: