| 注册
home doc ppt pdf
请输入搜索内容

热门搜索

年终总结个人简历事迹材料租赁合同演讲稿项目管理职场社交

TCPIP协议与网络编程期末大作业

文***享

贡献于2020-11-09

字数:21322

编号



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 if(str[i]'@')break
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 if(str[i]'@')break
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 if(str[i]'@')break
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 if(str[i]'@')break
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 if(str[i]'@')
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 if(str[i]'@')
break
str[i]'\0'

strcpy(Userstr+1)
printf(s 户接收\nUser)

strcpy(Passstr+i+1)

for(i1i if(Pass[i]'*')
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 if(strwchy[i]'')
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)户传

《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 香币 [ 分享文档获得香币 ]

该文档为用户出售和定价!

购买文档

相关文档

基于TCPIP协议的网络通信小应用程序课程设计

XX大学理学院( 计算机网络 )课程设计实验时间: 2010学年第二学期 专业年级: 2008级应数X班 实验题目: 基于TCP/IP协议的网络通信应用程序 学生姓名: 学号 自评成绩_95教师评成绩___学生姓名: 学号

文***享 3年前 上传596   0

网络编程实习报告

网络编程实习报告  [实习目的]   通过理论联系实际,巩固所学的知识,提高处理实际问题的能力,并为自己能顺利与社会环境接轨做准备。[实习任务]Linux下网络服务器开发(基于C语言);本文总结了我对Linux下网络服务器模型的认识。[实习内容]一.循环服务器1.循环服务器在同一个时刻只可以响应一个客户端的请求,对多个客户程序的处理是采用循环的方式进行; 2. UDP循环服务器的实现非常

啊***复 9年前 上传527   0

XX大学软件设计TCPIP网络通信程序设计实验报告

Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。Qt Creator可带来两大关键益处:提供首个专为支持跨平台开发而设计的集成开发环境 (IDE),并确保首次接触Qt框架的开发人员能迅速上手和操作。

z***u 5年前 上传1405   0

数控编程技术形考作业3

《数控编程技术》第三次作业姓 名:________________学 号:________________得 分:________________教师签名:________________ (第7-8章)第7章 简化编程指令及其编程方法一、填空题1、在铣削固定循环结束后,要使刀具返回R点平面,必须编程 指令。2、子程序的嵌套是

心***% 2年前 上传1027   0

数控编程技术形考作业1

《数控编程技术》第一次作业姓 名:________________学 号:________________得 分:________________教师签名:________________ (第1-3章)第1章 数控加工的编程基础一、填空题1、为了准确地判断数控机床的运动方向,特规定永远假设刀具相对于 坐标而运动。2、目前,数控编程所采用

心***% 3年前 上传1263   0

数控编程技术形考作业2

《数控编程技术》第二次作业姓 名:________________学 号:________________得 分:________________教师签名:________________ (第4-6章)第4章 基本功能指令的编程方法一、填空题1、用于控制开关量的功能指令是 。2、T0400的含义是

心***% 2年前 上传743   0

数控编程技术形考作业4

《数控编程技术》第四次作业姓 名:________________学 号:________________得 分:________________教师签名:________________ (第9-10章)第9章 数控铣削加工编程一、填空题1、数控铣床适宜按 法安排加工工序,以减少换刀次数。2、立式铣床通常进行插补的平面是

心***% 3年前 上传823   0

网络研修作业

网络研修作业  自然流淌的音乐最美   ――《行进中的歌》教学赏析  培训学习已经进入到中场,但学习的热情却越来越高涨。每一天都有新的体验,每一天都有新的收获,每一天都有新的提升。越来越喜欢音乐,虽然作为一名音乐教师已经近十年。但随着学习的不断深入,才发现自己与音乐教学的真谛相差甚远。因此,今天的学习比昨天、比前天、比任何时候更加认真、更加细心、更加静心。我在思索着李老师的课,也在反

10年前 上传621   0

linux编程SHELL编程实验报告

Linux编程课程设计报告题 目: Linux Shell编程 专 业 学 号 姓 名 指 导 教 师 日 期

z***u 1年前 上传621   0

最新国家开放大学电大《数控编程技术》《会计学概论》网络课形考网考作业(合集)答案

一、单选题(每小题4分,共60分)题目1下列叙述中,( )是数控编程的基本步骤之一。选择一项:a. 对刀b. 零件图设计c. 传输零件加工程序d. 程序校验与首件试切 题目2

电***全 4年前 上传477   0

最新国家开放大学电大《数控编程技术》网络课形考网考作业及答案

形考任务1一、单选题(每小题4分,共60分)题目1下列叙述中,( )是数控编程的基本步骤之一。选择一项:a. 对刀b. 零件图设计c. 传输零件加工程序d. 程序校验与首件试切 题目2

电***库 4年前 上传897   0

最新国家开放大学电大《数控编程技术》《医护心理学》网络课形考网考作业(合集)答案

一、单选题(每小题4分,共60分)题目1下列叙述中,( )是数控编程的基本步骤之一。选择一项:a. 对刀b. 零件图设计c. 传输零件加工程序d. 程序校验与首件试切 题目2程序字由地址码+数字构成,在下列各字中,属于尺寸字的是( )。选择一项:

电***全 4年前 上传927   0

最新国家开放大学电大《数控编程技术》《数控机床》网络课形考网考作业(合集)答案

最新国家开放大学电大《数控编程技术》《数控机床》网络课形考网考作业(合集)答案《数控编程技术》网络课答案形考任务1一、单选题(每小题4分,共60分)题目1下列叙述中,( )是数控编程的基本步骤之一。选择一项:a. 对刀b. 零件图设计c. 传输零件加工程序d. 程序校验与首件试切 题目2程序字由地址码+数字构成,在下列各字中,属于尺寸字的是( )。选择一项:a. D

电***库 4年前 上传1362   0

(精华版)最新国家开放大学电大《数控编程技术》网络课形考网考作业及答案

考试说明:2020年秋期电大把该网络课纳入到“国开平台”进行考核,该课程共有4个形考任务,针对该门课程,本人汇总了该科所有的题,形成一个完整的标准题库,并且以后会不断更新,对考生的复习、作业和考试起着非常重要的作用,会给您节省大量的时间。做考题时,利用本文档中的查找工具,把考题中的关键字输到查找工具的查找内容框内,就可迅速查找到该题答案。本文库还有其他网核及教学考一体化答案,敬请查看。课程总成绩 = 形成性考核×50% + 终结性考试×50% 形考任务1一、单选题(每小题4分,共60分)题目1下列叙述中,( )是数控编程的基本步骤之一。选择一项:d. 程序校验与首件试切 题目2程序字由地址码+数字构成,在下列各字中,属于尺寸字的是( )。选择一项:c. U-18.25

g***0 4年前 上传666   0

最新国家开放大学电大《数控编程技术》《数控加工工艺》网络课形考网考作业(合集)答案

一、单选题(每小题4分,共60分)题目1下列叙述中,( )是数控编程的基本步骤之一。选择一项:a. 对刀b. 零件图设计c. 传输零件加工程序d. 程序校验与首件试切

电***库 4年前 上传787   0

最新国家开放大学电大《数控编程技术》《健康评估》网络课形考网考作业(合集)答案

一、单选题(每小题4分,共60分)题目1下列叙述中,( )是数控编程的基本步骤之一。选择一项:a. 对刀b. 零件图设计c. 传输零件加工程序d. 程序校验与首件试切 题目2

电***全 4年前 上传475   0

“爱课程网络课程”大作业

“爱课程网络课程”大作业摘要:随着科学技术的不断发展,花卉栽培应用与养护技术也得到了很多改善和拓展,人们更加注意营造一个良好的生活环境,室内花卉一年四季生机盎然,始终享受到春天的生机。室内绿化过程中对花卉的栽培和养护,将直接关系到室内绿化的效果,花卉是室内绿化工程中的重要组成部分。因此,加强对室内花卉栽培和养护的探讨是非常必要的。关键词:室内花卉 科学栽培 应用 意义花草是大天然的

平***苏 2年前 上传566   0

计算机网络编程课程设计

课题一:基于TCP的Socket通讯编程一、 课程设计目的:1. 能够深刻了解socket编程思想;2. 从实现层面理解TCP和UDP链接的不同。二、 课程设计环境:1. windows XP或 win7 系统;2. 配置有java虚拟机的环境变量;3. 编写java程序的软件Eclipse。三、 课程设计原理: Windows Sockets规范本意在于提供给应用程序开发

文***品 3年前 上传546   0

网络推广服务协议

本协议是甲方网络推广服务的基础条款,甲乙双方同意授权委托乙方推广甲方淘宝店铺(以下简称“推广”或“渠道推广”)遵循本协议条款。本协议与补充协议及所有附件构成一个完整的协议(下称“本协议”),对甲乙双方均具有约束力。

梁***川 6年前 上传5018   0

交叉作业安全协议

交叉作业安全协议 1、      目的 1、因**金源人力资源服务有限公司(以下简称甲方)与**顺通物流运输公司(以下简称乙方)在八钢区域内部分工作存在交叉作业问题,为更好的保证员工工作安全,规范员工操作,特制定此协议。 二、双方作业流程 上车顶部作业(1号罐) 车辆就位,熄火停车,乙方司机离开驾驶室 甲方操作人员在指定地点放置“禁止启动”标识牌 甲方操作人员上至安全平台,乙方司机

荣***虎 11年前 上传12076   0

三菱FX系列PLC编程口通信协议举例

三菱FX系列PLC编程口通信协议举例1、DEVICE READ(读出软设备状态值)计算机向PLC发送:始命令首地址位数终和校验STXCMDGROUP ADDRESSBYTESETXSUM例子:从D123开始读取4个字节数据02h30h31h,30h,46h,36h30h,34h03h37h,34h地址算法:address=address*2+1000h

小***库 4年前 上传644   0

XX大学校园网络规划与设计网络规划与管理期末大作业

网络规划与管理期末大作业题 目: XX大学校园网络规划与设计 学 院: 物理与电子信息工程学院 班  级: 姓 名: 学 号:

文***品 2年前 上传633   1

《计算机网络原理》离线作业

  西安交通大学网络学院2014年秋季离线作业 《计算机网络原理》试卷 一.选择题(80分) 1. 下面不属于网络拓扑结构的是:(C  ) A.环形结构      B.总线结构    C.层次结构    D.网状结构 2. 下列有关网络拓扑结构的叙述中,最准确的是:( C  )_ A.星形结构的缺点是,当需要增加新的工作站时成本比较高 B.树型结构的线路复杂,网络管理也较困难

f***v 9年前 上传7975   0

接入层网络维护作业计划

接入层网络维护作业计划 编写网络维护作业计划的目的为了对**移动固网数据业务用户设备进行有效地维护,使维护工作更加有序、顺利开展,做到维护工作的标准化、精细化、制度化、规范化,使固网数据业务设备达到优等水平。该作业计划适用于**移动固网数据业务设备(包括不同厂家及型号的光猫、交换机、家庭网关、多媒体电话、IP电话及电源设备)的维护。 维护作业内容包括设备巡检、维修、配合网优项目的网络调整、人

d***0 13年前 上传14857   0

智能控制(神经网络)作业

智能控制作业学生姓名: 学 号: 专业班级: 7-2 采用BP网路、RBF网路、DRNN网路逼近线性对象,分别进行matlab仿真。 (一) 采用BP网络仿真网络结构为2-6-1。采样时间1ms,输入信号,权值的初值随机取值,。仿真m文件程序为: %BP simulationclear all;clear al

文***品 1年前 上传328   0