TCPIP协议网络编程
期末作业
题目: 基Socket网络通信
物联网工程 学院 计算机科学技术 专业
学 号
学生姓名
课教师
二〇六年X月
摘
课题基TCPUDP协议编写聊天室系统聊天室系统包括注册登陆群聊单聊显示线员退出功系统包括客户端服务器端客户显示端中客户端服务器端连接基TCP协议服务器端客户显示端发送数基UDP协议
课题网络协议栈中传输层应网络成基础传输层中网络套接字达数传送目实现聊天室系统功
关键词:TCPUDP聊天室网络套接字数传送
目录
第1章 总体设计 2
第2章 客户端设计 3
21 发送端设计 3
211 流程图 3
212 代码 3
22接收端设计 3
221 流程图 3
222 代码 3
第3章 服务器设计 4
31 流程图 4
32 代码 4
第4章 运行结果 5
第1章 总体设计
1 原理
11 TCP
面连接数流(SOCK_STREAM)传输程中设计基TCPIP协议程序传输层TCP协议特点通信前客户服务器间先建立连接数传输完成关闭连接释放网络资源
面连接客户服务器程序工作模型:
12 UDP
连接数报(SOCK_DGRAM)传输服务传输层协议时UDP协议面连接通信协议程特点必须客户服务器间建立连接通信方先发送数样首先发送数方成客户端接收数方服务器端数传输完毕关闭套接口释放网络资源通信程结束
连接数包传输服务通信客户端服务器端函数类似
面连接客户服务器程序工作模型:
13 流程图
基TCPUDP聊天室系统包括客户端客户显示端服务器端三部分功注册登陆群聊单聊显示线员退出客户端服务器端连接协议基TCP协议服务器端发送功基UDP协议客户端服务器端建立连接客户端进行操作数发送客户显示端
第2章 客户端设计
211 流程图
212 代码
#include
#include
#include
#pragma comment(lib Ws2_32lib)
#define BUFFER_SIZE 1024
void MySendMessage(SOCKET sSocketchar *responseint responseLen)
int main(int argc char **argv)
{
WSADATA wsaData
sockaddr_in sercli
SOCKET sClientwchysClient
int iLenwchyiLen
int iRecv
char send_buf[1000]
char recv_buf[BUFFER_SIZE]
if (WSAStartup(MAKEWORD(2 2) &wsaData) 0)
{
printf(WSAStartup()\n)
return 0
}
printf(手动连接模式中\n)
char szServer[256] 连接服务器址IP址
printf(请输入连接服务器IP址)
gets(szServer)
sersin_family AF_INET
sersin_port htons(5050)
sersin_addrs_addr inet_addr(szServer)
char user[20]password[20]
char str[100]str1[100]wchystr[100]
bool hasLoginfalse
绑定次开始放循环里555
wchysClientsocket(AF_INETSOCK_DGRAM0)
if(wchysClientINVALID_SOCKET){printf(socket()Faildd\nWSAGetLastError())return 0}
clisin_familyAF_INET
clisin_porthtons(5053)
clisin_addrs_addrhtonl(INADDR_ANY)
if(bind(wchysClient(LPSOCKADDR)&clisizeof(cli))SOCKET_ERROR)
{printf(bind()Faildd\nWSAGetLastError())return 0}
wchyiLensizeof(cli)
memset(recv_buf0sizeof(recv_buf))
sClient socket(AF_INET SOCK_STREAM 0)
if (sClient INVALID_SOCKET)
{
printf(socket()\n)
return 0
}
if (connect(sClient (sockaddr*)&ser sizeof(ser)) INVALID_SOCKET)
{
printf(socket()\n)
return 0
}
else
{
bool hasLoginfalse
while(hasLogin){
printf(\n)
printf(0注册\n)
printf(1登陆\n)
printf(2退出\n)
printf(请输入相应数字\n>)
scanf(s&str)
switch(str[0])
{
case '0'
printf(户名:)
scanf(suser)
printf(密 码:)
scanf(spassword)
strcpy(send_buf0)
strcat(send_bufuser)
strcat(send_buf@)
strcat(send_bufpassword)
MySendMessage(sClient send_buf sizeof(send_buf))
break
case '1'
printf(户名:)
scanf(suser)
printf(密 码)
scanf(spassword)
strcpy(send_buf1)
strcat(send_bufuser)
strcat(send_buf@)
strcat(send_bufpassword)
MySendMessage(sClient send_buf sizeof(send_buf))
iRecvrecvfrom(wchysClientrecv_bufBUFFER_SIZE0(SOCKADDR*)&cli&wchyiLen)
if(iRecvSOCKET_ERROR)
{printf(recvfrom()Faildd\nWSAGetLastError())return 0}
else if(iRecv0) break
else
{ 接收正确数
printf(recvs\nrecv_buf)
}
if(recv_buf[0]'@'&&recv_buf[1]'@'){
hasLogin0
system(cls)
printf(登录失败请重新登录注册登录^_^\n)
}
if(recv_buf[0]'*'&&recv_buf[1]'*'){
hasLogin0
system(cls)
printf(已方登陆\n)
printf(登录失败请重新选择户登录注册登录^_^\n)
}
if(recv_buf[0]'#'&&recv_buf[1]'#'){
hasLogin1
system(cls)
printf(登录成功^_^\n)
bool wchyhasLoginfalse
while(wchyhasLogin){
printf(\n)
printf(0群聊\n)
printf(1单聊\n)
printf(2线户\n)
printf(3退出\n)
printf(请输入相应数字\n>)
scanf(s&wchystr)
switch(wchystr[0])
{
case '0'
wchyhasLogin1
printf(输入exit退出\n)
printf(\n)
while(wchyhasLogin)
{
printf(>)
scanf(s&str)
if(strcmp(strexit)0)
{
strcpy(send_buf2)
strcat(send_bufuser)
strcat(send_buf@)
strcat(send_bufstr)
MySendMessage(sClient send_buf sizeof(send_buf))
}
else
{
system(cls)
wchyhasLogin0
}
}
break
case '1'
wchyhasLogin1
printf(请输入单聊象户名:)
scanf(s&str1)
strcpy(send_buf5)
strcat(send_bufstr1)
strcat(send_buf@)
strcat(send_bufuser)
strcat(send_buf*)
strcat(send_buf__Welcome__To__Single__Chat)
MySendMessage(sClient send_buf sizeof(send_buf))
iRecvrecvfrom(wchysClientrecv_bufBUFFER_SIZE0(SOCKADDR*)&cli&wchyiLen)
if(iRecvSOCKET_ERROR)
{printf(recvfrom()Faildd\nWSAGetLastError())return 0}
else if(iRecv0) break
else
{ 接收正确数
printf(recvs\nrecv_buf)
}
if(recv_buf[0]'^'&&recv_buf[1]'^'){
wchyhasLogin0
system(cls)
printf(单聊象存退出单聊模式\n)
}
if(recv_buf[0]'&'&&recv_buf[1]'&'){
wchyhasLogin0
system(cls)
printf(单聊象未线退出单聊模式\n)
}
if(recv_buf[0]''&&recv_buf[1]''){
printf(输入exit退出\n)
printf(\n)
while(wchyhasLogin)
{
printf(>)
scanf(s&str)
if(strcmp(strexit)0)
{
strcpy(send_buf5)
strcat(send_bufstr1)
strcat(send_buf@)
strcat(send_bufuser)
strcat(send_buf*)
strcat(send_bufstr)
MySendMessage(sClient send_buf sizeof(send_buf))
}
else
{
system(cls)
wchyhasLogin0
}
}
}
break
case '2'
strcpy(send_buf4)
strcat(send_bufuser)
strcat(send_buf@)
strcat(send_bufstr)
MySendMessage(sClient send_buf sizeof(send_buf))
system(cls)
break
case '3'
strcpy(send_buf3)
strcat(send_bufuser)
strcat(send_buf@)
MySendMessage(sClient send_buf sizeof(send_buf))
hasLogin0
wchyhasLogin1
system(cls)
break
default
system(cls)
printf(请输入正确信息\n)
break
}
}
}
break
case '2'
exit(0)
break
default
system(cls)
printf(请输入正确信息)
}
}
}
system(PAUSE)
closesocket(sClient)
WSACleanup()
return 0
}
void MySendMessage(SOCKET sSocketchar *responseint responseLen)
{
int iSend
iSendsend(sSocketresponseresponseLen0)
if(iSendSOCKET_ERROR)
{
printf(send()Failedd\nWSAGetLastError())
}
else if(iSend0)
else
{
printf(send() succeeded \n)
printf(\n)
}
}
22接收端设计
221 流程图
222 代码
#include
#include
for maincpp(1cpp)
#define DEFAULT_PORT 5051FOR RECV
#define DEFAULT_PORTSEND 5052FOR SEND
#define BUFFER_LENGTH 1000
const bool Debug0
#define MaxUser 1000
程序遇异常结束时会示出错误退出
成员结构信息
#define UserNameLen 200
#define PasswordLen 200
typedef struct
{
char UserName[200]
char Password[200]
bool Log否登陆
char Ip[20]
}
UserData
#define thefile configtxt
bool SaveData(UserData **userdataint userdatap)
初始化户数导入
int findUser(UserData **dataint numchar *name)
{
int i
for(i0i
if(strcmp(namedata[i]>UserName)0) return i
}
return 1
}
void deal(char *strUserData **dataint &numchar *responsechar *ip)
{
char User[UserNameLen]
char Pass[PasswordLen]
第位字符功号
0 注册
1 登陆
2 会话
3 退出
int it
if(str[0]'0')
{
注册消息格式 0+name+@+password
for(i1i
str[i]'\0'
strcpy(Userstr+1)
strcpy(Passstr+i+1)
tfindUser(datanumUser)
if(t1)
{该户名存注册
num++
data[num](UserData *)malloc(sizeof(UserData))
if(data[num]NULL){printf([+]ERRORmalloc failed\n)exit(1)}
strcpy(data[num]>UserNameUser)
strcpy(data[num]>PasswordPass)
data[num]>Log0
memset(data[num]>Ip'\0'sizeof(data[num]>Ip))
printf(s 户注册成功\nUser)
注册完成
返回成功信息
strcpy(response00)第位功号 第二位状态号 0表示成功 1表示失败
SaveData(datanum)
}
else
{fail
printf(s 户注册失败\nUser)
注册失败
strcpy(response01)
}
}
else if(str[0]'1')
{
登陆消息格式 1+name+@+password
for(i1i
str[i]'\0'
printf(id\ni)
strcpy(Userstr+1)
strcpy(Passstr+i+1)
tfindUser(datanumUser)
if(t1)
{找该户
printf(PasssPass)
printf(Pawdsdata[t]>Password)
if(strcmp(Passdata[t]>Password)0 && data[t]>Log0)
{密码验证成功
printf(s 登陆成功\nUser)
data[t]>Log1
strcpy(data[t]>Ipip)
strcpy(response10)
}
else if(strcmp(Passdata[t]>Password)0 && data[t]>Log1){
printf(s 已方登陆\nUser)
strcpy(response1@)
}
else
{
printf(s 登陆密码错误\nUser)
strcpy(response11)
}
}
else
{
printf(s 户存登陆失败\nUser)
strcpy(response12)
}
}
else if(str[0]'2')
{
会话消息格式 2+'name'+'@'+'(message)'
for(i1i
str[i]'\0'
strcpy(Userstr+1)
tfindUser(datanumUser)
if(t1 && strcmp(data[t]>UserNameUser)0 && strcmp(data[t]>Ipip)0)
{
表示确实正确户发会话
strcpy(response20)
strcat(responseUser)
strcat(response)
strcat(responsestr+i+1)
printf(ss\nUserstr+i+1)
}
else
{
strcpy(response21)
printf(非正确户发会话予处理\n)
}
}
else if(str[0]'3')
{
会话消息格式 3+'name'+'@'+'(message)'
for(i1i
str[i]'\0'
strcpy(Userstr+1)
tfindUser(datanumUser)
if(t1 && strcmp(data[t]>UserNameUser)0 && strcmp(data[t]>Ipip)0)
{
表示确实正确户发会话
strcpy(response30)
data[t]>Log0
memset(data[t]>Ip'\0'sizeof(data[t]>Ip))
printf(s 退出\ndata[t]>UserName)
}
else
{
strcpy(response31)
printf(非正确户发会话予处理)
}
}
else if(str[0]'4')
{
for(i1i
break
str[i]'\0'
strcpy(response40)
for(i0i
if(data[i]>Log1){
printf(s[s]线\ndata[i]>UserNamedata[i]>Ip)
printf(s\ndata[i]>UserName)
strcat(responsedata[i]>UserName)
strcat(response )
}
else{
printf(sdata[i]>Ip)
}
}
}
else if(str[0]'5')
{
for(i1i
break
str[i]'\0'
strcpy(Userstr+1)
printf(s 户接收\nUser)
strcpy(Passstr+i+1)
for(i1i
break
Pass[i]'\0'
printf(s 户发送\nPass)
tfindUser(datanumUser)
if(t1)
{
strcpy(response60)
printf(单聊象存)
}
else
{
if(data[t]>Log0)
{
strcpy(response61)
printf(s 未线\nUser)
}
else if(data[t]>Log1){
strcpy(response50)
strcat(responsePass)
strcat(response)
strcat(responsePass+i+1)
printf(ss\nPassPass+i+1)
printf(s 线进行聊天\nUser)
}
}
}
}
void MySendMessage(int sSocketchar *responseint responseLenSOCKADDR* cliint cliLen)
{
int iSend
iSendsendto(sSocketresponseresponseLen0(SOCKADDR*)clicliLen)
if(iSendSOCKET_ERROR)
{
printf(sendto()Failedd\nWSAGetLastError())
}
else if(iSend0)
else
{
printf(sendto() succeeded \n)
printf(\n)
}
}
bool InitData(UserData **sint numint &p)成功返回true 发生错误返回false
{
读取文件信息返回
FILE *fp
char UserBuf[UserNameLen]
char PassBuf[PasswordLen]
fpfopen(thefiler)
if(fp)
{
if(Debug) printf(config文件存\n)
}
else
{
if(Debug) printf(find configtxt\n)
while(feof(fp))
{
fgets(bufsizeof(buf)fp)
fscanf(fpsUserBuf)
fscanf(fpsPassBuf)
if(Debug) printf([+]Users Passwords\nUserBufPassBuf)
add
p++
s[p](UserData *)malloc(sizeof(UserData))
if(s[p]){printf([+]ERRORmalloc failed\n)return false}
strcpy(s[p]>UserNameUserBuf)
strcpy(s[p]>PasswordPassBuf)
s[p]>Log0
memset(s[p]>Ip'\0'sizeof(s[p]>Ip))
}
fclose(fp)
}
return true
}
bool SaveData(UserData **userdataint userdatap)
{
FILE *fp
建立配置文件
fpfopen(thefilew)
if(fp){printf([+]ERROR法创建config文件)return false}
int i
for(i0i
fprintf(fps suserdata[i]>UserNameuserdata[i]>Password)
if(iuserdatap)fprintf(fp\n)
}
fclose(fp)
}
#include
#include
#include
#pragma comment(libws2_32lib)
#includeserh
UserData *userdata[MaxUser]
int userdatap1
#define BUFFER_SIZE 2048
void CompressArrays(WSAEVENT events[] SOCKET sockets[] DWORD *total int index)
{
for (size_t i index + 1 i < *total i++)
{
events[i 1] events[i]
}
*total
}
int main(int argc char **argv)
{
InitData(userdataMaxUseruserdatap)
char response[BUFFER_LENGTH]
WSADATA wsaData
char buffer[BUFFER_SIZE]
sockaddr_in InternetAddr
客户址
struct sockaddr_in cli
struct sockaddr_in cliArray[WSA_MAXIMUM_WAIT_EVENTS]
int iLen
iLensizeof(cli)
udp发送
SOCKET sSocket
struct sockaddr_in ser
char send_buf[]udp
SOCKET sClient
SOCKET SocketArray[WSA_MAXIMUM_WAIT_EVENTS]
WSANETWORKEVENTS NetworkEvents
WSAEVENT NewEvent
WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS]
SOCKET Accept Listen
DWORD EventTotal 0
DWORD Index
if (WSAStartup(MAKEWORD(2 2) &wsaData) 0)
{
printf(WSAStartup()\n)
return 0
}
创建流式套接口
Listen socket(AF_INET SOCK_STREAM 0)
InternetAddrsin_family AF_INET
InternetAddrsin_addrs_addr htonl(INADDR_ANY)
InternetAddrsin_port htons(5050)
if (bind(Listen (PSOCKADDR)&InternetAddr sizeof(InternetAddr)) SOCKET_ERROR)
{
printf(bind()\n)
return 0
}
printf(\n)
printf(Server Waiting\n)
printf(\n)
创建事件象
NewEvent WSACreateEvent()
Listen套接口注册套接口连接关闭网络事件
WSAEventSelect(Listen NewEvent FD_ACCEPT | FD_CLOSE)
if (listen(Listen 5) SOCKET_ERROR)
{
printf(listen()\n)
return 0
}
SocketArray[EventTotal] Listen
EventArray[EventTotal] NewEvent
EventTotal++
udp
sSocket socket(AF_INET SOCK_DGRAM 0)
if(sSocketINVALID_SOCKET){
printf(failed)
return 0
}
sersin_familyAF_INET
sersin_porthtons(5051)
sersin_addrs_addrinet_addr(127001)
while (true)
{
套接口等网络事件发生
Index WSAWaitForMultipleEvents(EventTotal EventArray FALSE WSA_INFINITE FALSE)
if (WSAEnumNetworkEvents(SocketArray[Index WSA_WAIT_EVENT_0]
EventArray[Index WSA_WAIT_EVENT_0]
&NetworkEvents) SOCKET_ERROR)
{
printf(dn WSAGetLastError())
printf(WSAEnumNetworkEvents()\n)
return 0
}
检查FD_ACCEPT
if (NetworkEventslNetworkEvents & FD_ACCEPT)
{
if (NetworkEventsiErrorCode[FD_ACCEPT_BIT] 0)
{
WSACloseEvent(EventArray[Index WSA_WAIT_EVENT_0])
printf(FD_ACCEPT failed with error d\n NetworkEventsiErrorCode[FD_ACCEPT_BIT])
break
}
接收新连接存入套接口数组
Accept accept(SocketArray[Index WSA_WAIT_EVENT_0] (struct sockaddr*)&cli&iLen)
套接口数量超界时关闭该套接口
if (EventTotal > WSA_MAXIMUM_WAIT_EVENTS)
{
printf(Too many connections)
closesocket(Accept)
break
}
NewEvent WSACreateEvent()
if (NewEvent WSA_INVALID_EVENT)
{
printf(WSACreateEvent()\n)
break
}
WSAEventSelect(Accept NewEvent FD_READ | FD_WRITE | FD_CLOSE)
EventArray[EventTotal] NewEvent
SocketArray[EventTotal] Accept
cliArray[EventTotal] cli
EventTotal++
printf(Socket d connected\n Accept)
}
处理FD_READ通知
if (NetworkEventslNetworkEvents & FD_READ)
{
if (NetworkEventsiErrorCode[FD_READ_BIT] 0)
{
WSACloseEvent(EventArray[Index WSA_WAIT_EVENT_0])
printf(FD_READ failed with error d\n NetworkEventsiErrorCode[FD_READ_BIT])
break
}
套接口读入数
int iRecv recv(SocketArray[Index WSA_WAIT_EVENT_0] buffer sizeof(buffer) 0)
if (iRecv 0)
{
break
}
else if (iRecv SOCKET_ERROR)
{
printf(recv()\n)
break
}
else
{
请求端IP
sersin_addrs_addrinet_addr(inet_ntoa(cliArray[Index WSA_WAIT_EVENT_0]sin_addr))
printf(Accepted client IP[s]port[d]\n inet_ntoa(cliArray[Index WSA_WAIT_EVENT_0]sin_addr)ntohs(cliArray[Index WSA_WAIT_EVENT_0]sin_port))
printf(recvs\nbuffer)
memset(response'\0'sizeof(response))
deal(bufferuserdatauserdatapresponseinet_ntoa(cliArray[Index WSA_WAIT_EVENT_0]sin_addr))
printf(responses\nresponse)
int i
if(response[0]'2' && response[1]'0')
{处理20 群聊
printf(recvs\nbuffer)
for(i0i
if(userdata[i]>Log0)continue
sersin_addrs_addrinet_addr(userdata[i]>Ip)
MySendMessage(sSocketresponsesizeof(response)(SOCKADDR*)&sersizeof(ser))
}
}
else if(response[0]'5' && response[1]'0')
{处理50 单聊
char strwchy[2048]
strcpy(strwchyresponse)
printf(recvs\nbuffer)
for(i1i
break
strwchy[i]'\0'
printf(strwchys\nstrwchy+2)
for(i0i
if(strcmp((buffer+1)(strwchy+2))0){
if(strcmp((strwchy+2)userdata[i]>UserName)0){
发送单聊象
sersin_addrs_addrinet_addr(userdata[i]>Ip)
MySendMessage(sSocketresponsesizeof(response)(SOCKADDR*)&sersizeof(ser))
}
}
else{
if(strcmp((buffer+1)userdata[i]>UserName)0){
发送单聊象
sersin_addrs_addrinet_addr(userdata[i]>Ip)
MySendMessage(sSocketresponsesizeof(response)(SOCKADDR*)&sersizeof(ser))
}
if(strcmp((strwchy+2)userdata[i]>UserName)0){
发送单聊象
sersin_addrs_addrinet_addr(userdata[i]>Ip)
MySendMessage(sSocketresponsesizeof(response)(SOCKADDR*)&sersizeof(ser))
}
}
}
}
else if(response[0]'4' && response[1]'0')
{处理40 线数
printf(recvs\nbuffer)
for(i0i
if(strcmp((buffer+1)userdata[i]>UserName)0){
发请求方接收端
sersin_addrs_addrinet_addr(userdata[i]>Ip)
MySendMessage(sSocketresponsesizeof(response)(SOCKADDR*)&sersizeof(ser))
}
}
}
else
{
MySendMessage(sSocketresponsesizeof(response)(SOCKADDR*)&sersizeof(ser))
}
}
}
处理FD_CLOSE通知
if (NetworkEventslNetworkEvents & FD_CLOSE)
{
if (NetworkEventsiErrorCode[FD_WRITE_BIT] 0)
{
WSACloseEvent(EventArray[Index WSA_WAIT_EVENT_0])
printf(FD_WRITE faield with error d\n NetworkEventsiErrorCode[FD_WRITE_BIT])
break
}
关闭套接口
closesocket(SocketArray[Index WSA_WAIT_EVENT_0])
套接口事件事件数组中删关闭套接口关信息
CompressArrays(EventArray SocketArray &EventTotal Index WSA_WAIT_EVENT_0)
}
}
WSACleanup()
return 0
}
第3章 服务器设计
31 流程图
32 代码
#include
#include
#include
#include
#pragma comment(libws2_32lib)
#define DEFAULT_PORT 5051FOR RECV
#define BUFFER_LENGTH 1000
void MySendMessage(SOCKET sSocketchar *responseint responseLen struct sockaddr* cliint cliLen)
void main()
{
int iPortDEFAULT_PORT
WSADATA wsaData
SOCKET sSocketwchysSocket
int iLenwchyiLen
int iSend
int iRecv
char send_buf[1000]
char name[255]
char recv_buf[BUFFER_LENGTH]
char *ip
PHOSTENT hostinfo
struct sockaddr_in sercliwchy
if(WSAStartup(MAKEWORD(22)&wsaData)0)
{printf(Failed to load Winsock\n)return}
if( gethostname ( name sizeof(name)) 0)
{
if((hostinfo gethostbyname(name)) NULL)
{
ip inet_ntoa (*(struct in_addr *)*hostinfo>h_addr_list)
}
}
printf(\n)
printf(cServer Waiting\n)
printf(ip s\nip)
printf(\n)
sSocketsocket(AF_INETSOCK_DGRAM0)
if(sSocketINVALID_SOCKET){printf(socket()Faildd\nWSAGetLastError())return}
sersin_familyAF_INET
sersin_porthtons(iPort)
sersin_addrs_addrhtonl(INADDR_ANY)
if(bind(sSocket(LPSOCKADDR)&sersizeof(ser))SOCKET_ERROR)
{printf(bind()Faildd\nWSAGetLastError())return}
iLensizeof(cli)
memset(recv_buf0sizeof(recv_buf))
while(1)
{
接收数包 确定cli 表示 cli存客户端发 ipport
iRecvrecvfrom(sSocketrecv_bufBUFFER_LENGTH0(SOCKADDR*)&cli&iLen)
if(iRecvSOCKET_ERROR)
{printf(recvfrom()Faildd\nWSAGetLastError())return}
else if(iRecv0) break
else
{ 接收正确数
printf([+]s\nrecv_buf)
控制信息种类00 01 10 11 12 20 21 30 31
00注册成功 01 注册失败 10登陆成功 1112表示登陆失败 20表示次成功会话 21表示错误会话 30表示成功推出 31表示错误推出
switch(recv_buf[0])
{
case '0'
if(recv_buf[1]'0')printf(注册成功\n)
else printf(注册失败\n)
break
case '1'
if(recv_buf[1]'0')
{
printf(登陆成功\n)
wchysin_familyAF_INET
wchysin_porthtons(5053)
wchysin_addrs_addrinet_addr(127001)
wchysSocketsocket(AF_INETSOCK_DGRAM0)
if(wchysSocketINVALID_SOCKET)
{printf(socket()Failedd\nWSAGetLastError())return}
wchyiLensizeof(wchy)
strcpy(send_buf##)
MySendMessage(wchysSocketsend_bufsizeof(send_buf)(struct sockaddr*)&wchywchyiLen)
}
else if(recv_buf[1]'@')
{
printf(已方登陆\n)
wchysin_familyAF_INET
wchysin_porthtons(5053)
wchysin_addrs_addrinet_addr(127001)
wchysSocketsocket(AF_INETSOCK_DGRAM0)
if(wchysSocketINVALID_SOCKET)
{printf(socket()Failedd\nWSAGetLastError())return}
wchyiLensizeof(wchy)
strcpy(send_buf**)
MySendMessage(wchysSocketsend_bufsizeof(send_buf)(struct sockaddr*)&wchywchyiLen)
}
else{
printf(登陆失败\n)
wchysin_familyAF_INET
wchysin_porthtons(5053)
wchysin_addrs_addrinet_addr(127001)
wchysSocketsocket(AF_INETSOCK_DGRAM0)
if(wchysSocketINVALID_SOCKET)
{printf(socket()Failedd\nWSAGetLastError())return}
wchyiLensizeof(wchy)
strcpy(send_buf@@)
MySendMessage(wchysSocketsend_bufsizeof(send_buf)(struct sockaddr*)&wchywchyiLen)
}
break
case '2'
printf([群聊]s\nrecv_buf+2)
break
case '4'
printf(线户列表:s\nrecv_buf+2)
break
case '5'
printf([单聊])
wchysin_familyAF_INET
wchysin_porthtons(5053)
wchysin_addrs_addrinet_addr(127001)
wchysSocketsocket(AF_INETSOCK_DGRAM0)
if(wchysSocketINVALID_SOCKET)
{printf(socket()Failedd\nWSAGetLastError())return}
wchyiLensizeof(wchy)
strcpy(send_buf)
MySendMessage(wchysSocketsend_bufsizeof(send_buf)(struct sockaddr*)&wchywchyiLen)
printf(s\nrecv_buf+2)
break
case '6'
if(recv_buf[1]'0')
{
printf(单聊象存\n)
wchysin_familyAF_INET
wchysin_porthtons(5053)
wchysin_addrs_addrinet_addr(127001)
wchysSocketsocket(AF_INETSOCK_DGRAM0)
if(wchysSocketINVALID_SOCKET)
{printf(socket()Failedd\nWSAGetLastError())return}
wchyiLensizeof(wchy)
strcpy(send_buf^^)
MySendMessage(wchysSocketsend_bufsizeof(send_buf)(struct sockaddr*)&wchywchyiLen)
}
else if(recv_buf[1]'1')
{
printf(单聊象未线\n)
wchysin_familyAF_INET
wchysin_porthtons(5053)
wchysin_addrs_addrinet_addr(127001)
wchysSocketsocket(AF_INETSOCK_DGRAM0)
if(wchysSocketINVALID_SOCKET)
{printf(socket()Failedd\nWSAGetLastError())return}
wchyiLensizeof(wchy)
strcpy(send_buf&&)
MySendMessage(wchysSocketsend_bufsizeof(send_buf)(struct sockaddr*)&wchywchyiLen)
}
break
}
}
}
closesocket(sSocket)
WSACleanup()
}
void MySendMessage(SOCKET sSocketchar *responseint responseLen struct sockaddr* cliint cliLen)
{
int iSend
int sendto ( socket s const void * msg int len unsigned int flags const struct sockaddr * to int tolen )
iSendsendto(sSocketresponseresponseLen0(SOCKADDR*)clicliLen)
iSendsendto(sClientsend_bufsizeof(send_buf)0(struct sockaddr*)&seriLen)
if(iSendSOCKET_ERROR)
{
printf(sendto()Failedd\nWSAGetLastError())
}
else if(iSend0)
else
{
printf(sendto() succeeded \n)
printf(\n)
}
}
第4章 运行结果
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档