UDP命令行局域网聊天程序——windows版

翻了翻邮件,把以前TCP/IP课程的作业,一个命令行的聊天程序翻出来,准备改写,看看在linux下试试。主要是给自己磨磨刀。不多说,贴程序,自己看吧

下面是服务端程序:server.cpp

 

#include "stdafx.h"                     //预设环境
#include "winsock2.h"					//包含网络处理函数头文件
#pragma comment(lib,"Ws2_32.lib")		//包含静态链接库
int main(int argc, char* argv[])		//主函数开始
{
	WSADATA server;						//定义服务结构体
	WSAStartup(MAKEWORD(2,2),&server);	//初始化网络环境
	SOCKET serversock=socket(AF_INET,SOCK_DGRAM,IPPROTO_IP);	//创建socket套接口
	SOCKADDR_IN local;					//定义地址结构
	memset(&local,0,sizeof(local));		//地址结构清零
	local.sin_addr.s_addr=INADDR_ANY;	//定义地址结构的IP
	local.sin_family=AF_INET;			//定义地址结构类型
	local.sin_port=htons(8000);			//定义地址结构的端口
	SOCKADDR_IN client;					//定义服务结构体
	int len=sizeof(client);				//定义客户结构体
	int ret=1;							//定义出错函数
	bind(serversock,(SOCKADDR*)&local,sizeof(local));		//绑定套接口
	char buf[512]={0};					//定义接收地址空间

	while(ret!=0)						//循环接收
	{
		ret =recvfrom(serversock,buf,512,0,(SOCKADDR*)&client,&len);	//接收socket端口信息
		buf[ret] = '';				//设置接收信息结束符
		printf("%sn",buf);				//输出显示信息
	}
	closesocket(serversock);			//关闭socket
	WSACleanup();						//清理网络环境
	return 0;							//返回0
}

 

接下来是客户的程序:client.cpp

 

#include "stdafx.h"                     //预设环境
#include "winsock2.h"					//包含网络处理函数头文件
#include "string.h"						//包含字符串函数头文件
#pragma comment(lib,"Ws2_32.lib")		//包含静态链接库

//获取昵称函数:
void getname(char *name)				//定义昵称指针
{
	char yourname[40];					//定义昵称存储空间
	gets(yourname);						//获取昵称
	int i;
	for (i=0;i<40;i++)					//将昵称赋值指针变量给主函数
	{
		*name++=yourname[i];
	}
}
//主函数
int main(int argc, char* argv[])
{
	WSADATA client;						//定义结构体
	WSAStartup(MAKEWORD(2,2),&client);	//初始化网络环境
	SOCKET clientsocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_IP);	//创建socket套接口
	SOCKADDR_IN server;					//定义地址结构
	server.sin_family=AF_INET;			//定义地址结构类型
	server.sin_port=htons(8000);		//定义地址结构的端口
	server.sin_addr.s_addr=inet_addr("255.255.255.255");		//定义地址结构的IP
	BOOL bBroadcast=TRUE;				//设置广播包选项
	setsockopt(clientsocket,SOL_SOCKET,SO_BROADCAST,(char*)&bBroadcast,sizeof(BOOL));		//设置socket支持广播包

	char namebuf[40];					//定义名字保存的空间
	char buf[470]={0};					//定义信息保存的空间
	char message[512]={NULL};			//设置发送服务器的信息的保存空间
	char flag='n';

	do
	{
		printf("输入你的昵称:n");		//输出显示信息
		getname(namebuf);						//输入用户昵称
		printf("你的昵称是:%sn你是否确定使用这个昵称?确定请输入Y,更改请输入Nn",namebuf);		//输出提示信息
		scanf("%s",&flag);
	} while (flag=='n'||flag=='N');
	printf("现在你可以用你的昵称“%s”在局域网进行聊天了。n",namebuf);

	strcpy(message,namebuf);			//拷贝姓名信息到发送信息空间
	message[strlen(namebuf)]=':';		//拷贝信息特殊符号到信息发送空间

	while(strcmp(buf,"bye"))			//循环函数
	{
		gets(buf);						//输入发送用户要说的信息
		char messageto[512];			//定义临时用户保存空间
		strcpy(messageto,message);		//将用户发送信息空间内容保存到临时用户保存空间
		strcat(messageto,buf);			//将用户要说的信息追加到临时信息保存空间末尾
		sendto(clientsocket,messageto,strlen(messageto),0,(SOCKADDR*)&server,sizeof(server));		//通过socket发送信息
	}
	closesocket(clientsocket);			//关闭socket
	WSACleanup();						//清理网络环境
	return 0;							//返回0
}

 

这都是在VC6.0 SP6下编译通过的,忽然发现,自己做的备注是这么齐全。嘿嘿。慢慢研究,准备移植Linux在做扩展。

刚才看了一下何李石的文章,一个云计算工程师的题目,链接在这里。发现自己真的很菜,而且英语不好,看不懂题目。python简单了学过一点点,还是很难看到他的算法,有空在研究吧。

{ 发表评论? }

  1. iCyOMiK

    喔,支持一下。

  2. iCyOMiK

    话说真的很精简。

  3. 图图网

    博主辛苦,虽然简陋,但还是要支持

  4. ikbear

    cool!
    注释齐全,说明你不仅能写出可以work的东西来,对里面的东西也真懂。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>