65,210
社区成员
发帖
与我相关
我的任务
分享
//如果是发送者,则不发送数据
fd_set fdsetWrite;
FD_ZERO(&fdsetWrite);
FD_SET(hSocket,&fdsetWrite);
TIMEVAL tv;
tv.tv_sec=0; tv.tv_usec=0;
int nNum=select(0,NULL,&fdsetWrite,NULL,&tv);
if(nNum == SOCKET_ERROR || 0 == nNum)
//已经退出
else
//socket好使;
// 客户端.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#include <iostream.h>
#include <process.h>
SOCKET sockClient;
void zikehu(void* para)
{
char neirong[1020];
while(1)
{
unsigned long ul = 1;
int iResult = ioctlsocket(sockClient,FIONBIO, (unsigned long *)&ul);
recv(sockClient,neirong,1020,0);
if(neirong[0]=='c'&&neirong[1]=='h'&&neirong[2]=='a'&&neirong[3]=='t')
{
neirong[0]=' ';
int tmp=0;
for(int i=4;neirong[i]!='\0';i++)
{
if(neirong[i]=='v'&&neirong[i+1]=='k'&&neirong[i+2]=='-')
{
if(tmp==0)
{
cout<<" 对你说:";
i=i+3;
tmp=1;
}
cout<<neirong[i];
}
else
{
cout<<neirong[i];
}
tmp=0;
}
cout<<endl;
}
Sleep(200);
}
}
void main()
{
char ip[50];
cout<<"请输入服务器的IP地址"<<endl;
cin>>ip;
WSADATA wsaData;
WORD banben;
banben=MAKEWORD(1,1);
WSAStartup(banben,&wsaData);
sockClient=socket(AF_INET,SOCK_STREAM,0);//创建套接字(socket)。
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(ip);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(5043);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//向服务器发出连接请求(connect)。
char recvBuf[100];//和服务器端进行通信(send/recv)。
recvBuf[0]='\0';
recv(sockClient,recvBuf,100,0);
if(recvBuf[0]=='\0')
{
printf("连接服务器失败!\n",NULL);
return;
}
printf("%s\n",recvBuf);
printf("请设定你的昵称\n",NULL);
char nicheng[100];
cin>>nicheng;
send(sockClient,nicheng,strlen(nicheng)+1,0);
int caozuo;
_beginthread(zikehu,0,NULL);
menu:
cout<<"----------请选择操作----------"<<endl;
cout<<"1.看看谁在线上"<<endl;
cout<<"2.开始对话"<<endl;
cout<<"3.退出"<<endl;
cin>>caozuo;
if(caozuo==1)
{
send(sockClient,"0",strlen("0")+1,0);
char tmp[2000];
tmp[0]='\0';
jieshou:
recv(sockClient,tmp,2000,0);
if(tmp[0]=='\0')
{
goto jieshou;
}
for(int i=0;i!=2000;i++)
{
if(tmp[i]==',')
{
cout<<endl;
}
else if(tmp[i]=='\0')
{
break;
}
else
{
cout<<tmp[i];
}
}
}
if(caozuo==2)
{
char name[100],name1[101],x[10];
cout<<"请输入你要对话的人的昵称"<<endl;
cin>>name;
name1[0]='1';
name1[1]='\0';
strcat(name1,name);
send(sockClient,name1,strlen(name1)+1,0);
recv(sockClient,x,10,0);
if(x[0]=='0')
{
cout<<"你输入的用户不存在,对话被拒绝"<<endl;
goto menu;
}
else
{
char chat[1000];
cout<<"你对 "<<name<<" 说:";
cin>>chat;
send(sockClient,chat,strlen(chat)+1,0);
}
}
if(caozuo==3)
{
send(sockClient,"exit",strlen("exit")+1,0);
cout<<"退出成功!"<<endl;
goto exit;
}
goto menu;
exit:
closesocket(sockClient);//关闭套接字。
WSACleanup();//必须调用这个函数清除参数
}
#include "stdafx.h"
#include <Winsock2.h>//加裁头文件
#include <stdio.h>//加载标准输入输出头文件
#include <iostream.h>
#include <process.h>
struct LIST
{
char name[50];
SOCKET lianjie;
};
SOCKADDR_IN duihua[2000];
int biaoji,renshu=0;
LIST list[500];
void zikehu(void* para)
{
int biaozhi=biaoji;
char buf[100];
sprintf(buf,"%s 已经成功连接服务器",inet_ntoa(duihua[biaozhi].sin_addr));
send(list[biaozhi].lianjie,buf,strlen(buf)+1,0);
char buf2[100];
recv(list[biaozhi].lianjie,buf2,100,0);
printf("用户 %s 已经成功连接服务器\n",buf2);
strcat(list[renshu-1].name,buf2);
char buf3[100];
buf3[0]='\0';
while(1)
{
send(list[biaozhi].lianjie,"-",strlen("-")+1,0);
recv(list[biaozhi].lianjie,buf3,100,0);
if(buf3[0]=='0')
{
printf("用户 %s 请求在线用户列表\n",buf2);
buf3[0]='\0';
char zaixian[2000];
zaixian[0]='\0';
for(int i=0;i<renshu;i++)
{
if(list[i].name[0]=='\0')
continue;
strcat(zaixian,list[i].name);
strcat(zaixian,",");
}
cout<<"发送在线列表源数据:"<<zaixian<<endl;
send(list[biaozhi].lianjie,zaixian,strlen(zaixian)+1,0);
}
else if(buf3[0]=='1')
{
int x=0;
SOCKET tmp1;
buf3[0]=' ';
cout<<"用户 "<<buf2<<" 向"<<buf3<<" 发起对话"<<endl;
for(int j=0;j<=strlen(buf3);j++)
{
buf3[j]=buf3[j+1];
}
buf3[strlen(buf3)]='\0';
for(int i=0;i<=renshu;i++)
{
if(!strcmp(list[i].name,buf3))
{
x=1;
tmp1=list[i].lianjie;
}
}
if(x==0)
{
cout<<"警告:用户 "<<buf3<<" 不存在!"<<endl;
send(list[biaozhi].lianjie,"0",strlen("0")+1,0);
}
else
{
char fasong[1010];
char sed[1020];
send(list[biaozhi].lianjie,"1",strlen("0")+1,0);
recv(list[biaozhi].lianjie,fasong,1010,0);
sed[0]='\0';
strcat(sed,"chat");
strcat(sed,list[biaozhi].name);
strcat(sed,"vk-");
strcat(sed,fasong);
send(tmp1,sed,strlen(sed)+1,0);
cout<<"发送聊天源数据:"<<sed<<endl;
}
}
else if(buf3[0]=='e'&&buf3[1]=='x'&&buf3[2]=='i'&&buf3[3]=='t')
{
cout<<"用户 "<<list[biaozhi].name<<" 已经退出服务器!"<<endl;
list[biaozhi].name[0]='\0';
list[biaozhi].lianjie=0;
return;
}
buf3[0]='\0';
Sleep(300);
}
}
void main()
{
WSADATA wsaData;
WORD banben;
banben=MAKEWORD(1,1);
WSAStartup(banben,&wsaData);
SOCKET taolian;
taolian=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN dizhi;
dizhi.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
dizhi.sin_family=AF_INET;
dizhi.sin_port=htons(5043);
bind(taolian,(SOCKADDR*)&dizhi,sizeof(SOCKADDR));
listen(taolian,5);
int len=sizeof(SOCKADDR);
cout<<"服务器成功启动!"<<endl;
while(1)
{
biaoji=renshu;
list[renshu].lianjie=accept(taolian,(SOCKADDR*)&duihua[renshu],&len);//程序会暂停在此直到接收到客户端链接
_beginthread(zikehu,0,NULL);
Sleep(50);
renshu++;
}
}