修改下面的代码如何实现服务器与多个客户端的通信,求大神解释,初学小白

qq_37851694 2017-11-27 01:49:28
//服务器
#include <stdio.h>
#include <windows.h>
#pragma comment(lib, "Ws2_32.lib")
/***定义端口**/
#define PORT 8888
/***定义最大传输数据量**/
#define MAXDATA 100
/****在入口函数中输入主机IP地址****/
int main(int argc, char** argv)
{
/*定义标志,接收到第一个client时,不在接收其他client*/
int flag = 1;
/*得到socket嵌套字*/
SOCKET server;
/*定义发送消息的长度*/
int sdMsgLen;
/*启动windows的socket服务*/
WSADATA wsaData;//Windows sockets DLL版本信息
WSAStartup(0x101,&wsaData);
char *CloseClient = "bye";
char* CloseC_S = "byebye";

/*定义receive数据长度*/
int receive;
int len;
/*创建服务器*/
struct sockaddr_in serveraddr;
/*创建客户端*/
struct sockaddr_in addrClient;
/*将serveraddr置零*/
memset((void*)&serveraddr,0,sizeof(serveraddr));
/*定义家族协议*/
serveraddr.sin_family = AF_INET;
/*定义主机地址*/
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);//);"192.168.1.100"
/*定义主机端口*/
serveraddr.sin_port = htons(PORT);
/*得到socket嵌套字*/
server = socket(AF_INET,SOCK_STREAM,0);
/*返回值为-1,未启动windows的socket服务*/
if(server==-1)
{
perror("socket error!");
}
/*绑定成功返回0*/
if(bind(server,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) == -1)
{
perror("不能进行绑定!");
exit(1);
}
/*定义客户端嵌套字*/
SOCKET client;
/*进入监听客户端连接和监听客户端发送的消息*/
while(1)
{
/*定义并初始化接收数据的存储*/
char receiveBuffer[MAXDATA] = "\n";
/*定义并初始化发送数据存储*/
char sendBuffer[MAXDATA] = "\n";
/*采用异步发送消息*/
bool sendFlag = false;
/*监听客户端*/
if(listen(server,20) == -1)
{
perror("不能进行监听!");
exit(1);
}
/*接收到第一个用户后将其锁定,不在接收其他用户*/
if(flag)
{
len = sizeof(struct sockaddr_in);
/*得到客户端的嵌套字*/
client = accept(server,(SOCKADDR*)&addrClient,&len);
if(client == -1)
{
perror("accept error");
continue;
}
printf("新连接: %s \n",inet_ntoa(addrClient.sin_addr));
/*创建一个消息*/
char* msg = "Hello,Connected Successfully!\n";
int len = strlen(msg);
/*得到send的返回值,返回为发送消息的长度.若发送失败则返回-1*/
int sendLen = send(client,msg,len,0) ;
if(sendLen == -1)
{
perror("消息发送失败!\n");
closesocket(client);
}
msg=0;
/*接收到第一个客户端,将其锁定*/
flag = 0;
}
/*得到接收到消息的长度*/
receive = recv(client,receiveBuffer,MAXDATA,0);
/*若消息长度为-1,则接收数据失败*/
if(receive == -1)
{
perror("接收出错!\n");
/*关闭客户端*/
closesocket(client);
}

printf("%s\n",receiveBuffer);
/*测试客户端发送的结束通话标志*/
if(strcmp(receiveBuffer,CloseClient) == 0)
{
printf("失去客户端:%s\n",inet_ntoa(addrClient.sin_addr));
flag = 1;

closesocket(client);

}
else if(strcmp(receiveBuffer,CloseC_S) == 0)
{

closesocket(server);
exit(1);
}
else
{
printf("Client %s send message : %s\n",inet_ntoa(addrClient.sin_addr),receiveBuffer);
/*当接收到消息后,服务器才可以发送消息*/
sendFlag = true;
}
while(sendFlag)
{
printf("Your Message:");
/*得到服务器输入的字符串*/
scanf("%s",sendBuffer);
sdMsgLen = strlen(sendBuffer);
/*得到服务器发送消息的长度*/
int sendLen = send(client,sendBuffer,sdMsgLen,0);
if(sendLen == -1)
{
perror("消息发送失败!");
closesocket(client);
}
/*结束服务器发送消息模式,改为接收模式*/
sendFlag = false;
}
}

return 0;
}









//客户机
#include <windows.h>
#include <stdio.h>
#include <errno.h>
#pragma comment(lib, "Ws2_32.lib")
/*定义与主机连接的端口*/
#define PORT 8888
/*定义最大传输数据量*/
#define MAXDATA 100
/*由入口函数得到需要连接主机的IP地址*/
int main(int ars,char** arg)
{
/*开启windows的socket*/
WSADATA wsaData;
WSAStartup(0x101,&wsaData);

/*定义服务器*/
struct sockaddr_in serveraddr;
/*将serveraddr清零*/
memset((void*)&serveraddr,0,sizeof(serveraddr));
/*定义家族协议*/
serveraddr.sin_family = AF_INET;
/*得到主机IP地址*/
serveraddr.sin_addr.s_addr = inet_addr(arg[1]);//);//)"192.168.1.100";
/*得到端口*/
serveraddr.sin_port = htons(PORT);
/*得到socket嵌套字*/
SOCKET s = socket(AF_INET,SOCK_STREAM,0);
/*
*建立TCP连接
*参数1:socket返回的描述符
*参数2:主机IP地址和端口号指针
*参数3:远端地质借口长度
*/
if(connect(s,(struct sockaddr*)&serveraddr,sizeof(serveraddr)) == -1)
{
perror("连接错误!");
exit(1);
}
/*进入监听服务器发送消息,采取异步通信*/
while(1)
{
/*初始化接收和发送数据的存储*/
char receiveBuffer[MAXDATA] = "\n";
char sendBuffer[MAXDATA] = "\n";
/*定发送模式*/
bool sendFlag = false;
/*如果接收数据位-1则接收错误,正确是recv返回接收到数据的长度*/
if(recv(s,receiveBuffer,MAXDATA,0)==-1)
{
perror("接收数据错误!");
exit(1);
}

printf("server %s send message: %s\n",inet_ntoa(serveraddr.sin_addr),receiveBuffer);
/*发送模式*/
sendFlag = true;
while(sendFlag)
{
char* CloseClient = "bye";
char* CloseC_S = "byebye";
/*得到输入的数据*/
printf("Your Message :");
scanf("%s",sendBuffer);
if(strcmp(sendBuffer,CloseClient) == 0)
{
send(s,CloseClient,strlen(CloseClient),0);

closesocket(s);
exit(1);
}
else{
/*得到发送数据的长度*/
int sendLen = send(s,sendBuffer,strlen(sendBuffer),0);
/*发送数据长度为-1时,发送失败*/
if(sendLen == -1)
{
perror("发送错误!");
closesocket(s);
}
}
/*发送模式结束,进入接收模式*/
sendFlag = false;
}


}
return 0;
}
...全文
387 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
叶恭介叶恭介 2017-11-29
  • 打赏
  • 举报
回复
你这个源码由于是TCP很难改。 要改成select模型才行,《精通Windows Sockets网络开发:基于Visual C++实现》
赵4老师 2017-11-28
  • 打赏
  • 举报
回复
百度搜相关关键字。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧