翻了翻邮件,把以前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简单了学过一点点,还是很难看到他的算法,有空在研究吧。
喔,支持一下。
话说真的很精简。
是啊,一个socket加循环,完了。移植到linux,再加点功能吧,当作学习。
博主辛苦,虽然简陋,但还是要支持
cool!
注释齐全,说明你不仅能写出可以work的东西来,对里面的东西也真懂。
懂是懂点,对你们来说,我只是皮毛啦。