基于socket简易聊天程序.docx
- 文档编号:7013389
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:7
- 大小:168.95KB
基于socket简易聊天程序.docx
《基于socket简易聊天程序.docx》由会员分享,可在线阅读,更多相关《基于socket简易聊天程序.docx(7页珍藏版)》请在冰点文库上搜索。
基于socket简易聊天程序
基于socket简易聊天程序
简单的socket程序
2010-01-1322:
18
虽然很简单,但还是调试了很长时间。
本科时候接触过socket——那个帅帅的刘老师的课,现在重新再捡起来。
程序中专门建立一个FunThread线程用来接收数据,实现双向通信,也可以连续发送、连续接收。
代码贴上来,如果还能保留VAView那样的颜色区别就好看了,但是试了好几遍都不行
server:
#include
#include
#definePORT 6000//服务器端口
#defineMSGSIZE 1024//收发缓冲区的大小
#pragmacomment(lib,"ws2_32.lib")//链接静态库
DWORDWINAPIFunThread(LPVOID);//创建一个线程,专门用来接收数据
SOCKET sClient;//连接所用套节字
SOCKET sListen;//监听套接字
SOCKADDR_INclient;//保存客户的地址信息
int iaddrSize=sizeof(SOCKADDR_IN);
intmain()
{
WSADATA wsaData;
SOCKADDR_INlocal;
char s_Message[MSGSIZE];//收发缓冲区
WSAStartup(0x0202,&wsaData);//InitializeWindowssocketlibrary
sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//创建服务器监听套节字。
TCP协议
local.sin_family=AF_INET;//AF_INET指明使用TCP/IP协议族
local.sin_port=htons(PORT);//指明连接服务器的端口号
local.sin_addr.s_addr=htonl(INADDR_ANY);//自动获取本机地址
bind(sListen,(structsockaddr*)&local,sizeof(SOCKADDR_IN));//地址绑定到套接字
listen(sListen,1);//开始监听
sClient=accept(sListen,(structsockaddr*)&client,&iaddrSize);//建立连接
printf("Accepteclient:
%s:
%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
HANDLEhThread=CreateThread(NULL,0,FunThread,0,0,0);//创建接收线程
CloseHandle(hThread);
while(TRUE)
{
printf("ServerSend:
");
//从键盘输入
gets(s_Message);
//发送数据
send(sClient,s_Message,strlen(s_Message),0);
}
return0;
}
DWORDWINAPIFunThread(LPVOID)
{
charc_Message[MSGSIZE];//收发缓冲区
intret;//接收字节的个数
while(TRUE)
{
ret=recv(sClient,c_Message,MSGSIZE,0);//接收数据
if(ret==SOCKET_ERROR)
{
printf("\nclientisclosed!
");
sClient=accept(sListen,(structsockaddr*)&client,&iaddrSize);//重新开始监听
printf("\nAcceptenewclient:
%s:
%d",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
memset(c_Message,0,1024);//将原来的clientmessage归零
continue;
}
c_Message[ret]='\0';
printf("\nReceived:
%s\n",c_Message);
}
return0;
}
client:
#include
#include
#defineSERVER_ADDRESS"127.0.0.1"//服务器端IP地址
#definePORT 6000
#defineMSGSIZE 1024
#pragmacomment(lib,"ws2_32.lib")
DWORDWINAPIFunThread(LPVOID);
SOCKET sClient;
SOCKADDR_INserver;
intmain()
{
WSADATA wsaData;
char c_Message[MSGSIZE];
WSAStartup(0x0202,&wsaData);
sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
memset(&server,0,sizeof(SOCKADDR_IN)); //先将保存地址的server置为全0
server.sin_family=PF_INET; //声明地址格式是TCP/IP地址格式
server.sin_port=htons(PORT); //指明连接服务器的端口号
server.sin_addr.s_addr=inet_addr(SERVER_ADDRESS); //指明连接服务器的IP地址
connect(sClient,(structsockaddr*)&server,sizeof(SOCKADDR_IN));//连到刚才指明的服务器上
HANDLEhThread=CreateThread(NULL,0,FunThread,0,0,0);
CloseHandle(hThread);
while(TRUE)
{
printf("ClientSend:
");
gets(c_Message);
send(sClient,c_Message,strlen(c_Message),0);
if(!
strcmp(c_Message,"exit"))//client自身退出
exit
(1);
}
//释放连接和进行结束工作
closesocket(sClient);
WSACleanup();
return0;
}
DWORDWINAPIFunThread(LPVOID)
{
char s_Message[MSGSIZE];
int ret;
while(TRUE)
{
ret=recv(sClient,s_Message,MSGSIZE,0);
if(ret==SOCKET_ERROR)
{
printf("\nServerisclosed!
\n");
exit
(1);
}
s_Message[ret]='\0';
printf("\nReceived:
%s\n",s_Message);
if(!
strcmp(s_Message,"exit"))//server让client退出
exit
(1);
}
return0;
}
程序在VC++6.0环境下编译通过。
先运行server端,再运行client,链接建立:
client和server可进行双通信,可连续发送、接收;client可自行退出,也可由server强制退出,发送exit命令即可:
client退出后,server重新建立监听,有新的client运行时,再次建立新的连接:
注意:
client的端口号是随机的。
服务器关闭时,client自动退出:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 socket 简易 聊天 程序
![提示](https://static.bingdoc.com/images/bang_tan.gif)