基于socket简易聊天程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简单的socket程序
2010-01-13 22:18
虽然很简单,但还是调试了很长时间。
本科时候接触过socket——那个帅帅的刘老师的课,现在重新再捡起来。
程序中专门建立一个FunThread线程用来接收数据,实现双向通信,也可以连续发送、连续接收。
代码贴上来,如果还能保留VA View那样的颜色区别就好看了,但是试了好几遍都不行
server:
#include <>
#include <>
#define PORT 6000 //服务器端口
#define MSGSIZE 1024 //收发缓冲区的大小
#pragma comment(lib, "") //链接静态库
DWORD WINAPI FunThread(LPVOID); //创建一个线程,专门用来接收数据SOCKET sClient; //连接所用套节字
SOCKET sListen; //监听套接字
SOCKADDR_IN client; //保存客户的地址信息
int iaddrSize = sizeof(SOCKADDR_IN);
int main()
{
WSADATA wsaData;
SOCKADDR_IN local;
char s_Message[MSGSIZE]; //收发缓冲区
WSAStartup(0x0202, &wsaData); //Initialize Windows socket library
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器监听套节字。
TCP协议
= AF_INET; //AF_INET指明使用TCP/IP协议族
= htons(PORT);//指明连接服务器的端口号
= htonl(INADDR_ANY);//自动获取本机地址
bind(sListen, (struct sockaddr *)&local, sizeof(SOCKADDR_IN));//地址绑定到套接字
listen(sListen, 1);//开始监听
sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);//建立连接
printf("Accepte client:%s:%d\n", inet_ntoa, ntohs);
HANDLE hThread=CreateThread(NULL,0,FunThread,0,0,0);//创建接收线程CloseHandle(hThread);
while (TRUE)
{
printf("Server Send:");
//从键盘输入
gets(s_Message);
//发送数据
send(sClient, s_Message, strlen(s_Message), 0);
}
return 0;
}
DWORD WINAPI FunThread(LPVOID)
{
char c_Message[MSGSIZE]; //收发缓冲区
int ret; //接收字节的个数
while (TRUE)
{
ret = recv(sClient, c_Message, MSGSIZE, 0);//接收数据
if(ret==SOCKET_ERROR)
{
printf("\nclient is closed!");
sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);//重新开始监听
printf("\nAccepte new client:%s:%d", inet_ntoa, ntohs);
memset(c_Message,0,1024);//将原来的client message归零
continue;
}
c_Message[ret] = '\0';
printf("\nReceived: %s\n", c_Message);
}
return 0;
}
client:
#include <>
#include <>
#define SERVER_ADDRESS "" //服务器端IP地址
#define PORT 6000
#define MSGSIZE 1024
#pragma comment(lib, "")
DWORD WINAPI FunThread(LPVOID);
SOCKET sClient;
SOCKADDR_IN server;
int main()
{
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
= PF_INET; //声明地址格式是TCP/IP地址格式
= htons(PORT); //指明连接服务器的端口号
= inet_addr(SERVER_ADDRESS); //指明连接服务器的IP地址
connect(sClient, (struct sockaddr *)&server, sizeof(SOCKADDR_IN)); //连到刚才指明的服务器上
HANDLE hThread=CreateThread(NULL,0,FunThread,0,0,0);
CloseHandle(hThread);
while (TRUE)
{
printf("Client Send:");
gets(c_Message);
send(sClient, c_Message, strlen(c_Message), 0);
if(!strcmp(c_Message,"exit"))//client自身退出
}
// 释放连接和进行结束工作
closesocket(sClient);
WSACleanup();
return 0;
}
DWORD WINAPI FunThread(LPVOID)
{
char s_Message[MSGSIZE];
int ret;
while (TRUE)
{
ret = recv(sClient, s_Message, MSGSIZE, 0);
if(ret==SOCKET_ERROR)
{
printf("\nServer is closed!\n");
exit(1);
}
s_Message[ret] = '\0';
printf("\nReceived: %s\n", s_Message);
if(!strcmp(s_Message,"exit"))//server让client退出
}
return 0;
}
程序在VC++ 环境下编译通过。
先运行server端,再运行client,链接建立:
client和server可进行双通信,可连续发送、接收;client可自行退出,也可由server强制退出,发送exit命令即可:
client退出后,server重新建立监听,有新的client运行时,再次建立新的连接:
注意:client的端口号是随机的。
服务器关闭时,client自动退出:。