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


    编号



    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班 ...

    3年前   
    598    0

    网络编程实习报告

    网络编程实习报告  [实习目的]   通过理论联系实际,巩固所学的知识,提高处理实际问题的能力,并为自己能顺利与社会环境接轨做准备。[实习任务]Linux下网络服务器开发(基于C语言);本文总...

    9年前   
    532    0

    数控编程技术形考作业3

    《数控编程技术》第三次作业姓 名:________________学 号:________________得 分:________________教师签名:____________...

    2年前   
    1046    0

    数控编程技术形考作业1

    《数控编程技术》第一次作业姓 名:________________学 号:________________得 分:________________教师签名:____________...

    3年前   
    1278    0

    数控编程技术形考作业4

    《数控编程技术》第四次作业姓 名:________________学 号:________________得 分:________________教师签名:____________...

    3年前   
    831    0

    数控编程技术形考作业2

    《数控编程技术》第二次作业姓 名:________________学 号:________________得 分:________________教师签名:____________...

    2年前   
    759    0

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

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

    5年前   
    1413    0

    网络研修作业

    网络研修作业  自然流淌的音乐最美   ――《行进中的歌》教学赏析  培训学习已经进入到中场,但学习的热情却越来越高涨。每一天都有新的体验,每一天都有新的收获,每一天都有新的提升。越来越喜欢音...

    10年前   
    622    0

    linux编程SHELL编程实验报告

    Linux编程课程设计报告题 目: Linux Shell编程 专 业 学 号 姓 名 ...

    2年前   
    624    0

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

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

    4年前   
    902    0

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

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

    4年前   
    479    0

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

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

    4年前   
    936    0

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

    最新国家开放大学电大《数控编程技术》《数控机床》网络课形考网考作业(合集)答案《数控编程技术》网络课答案形考任务1一、单选题(每小题4分,共60分)题目1下列叙述中,( )是数控编程的基本步骤...

    4年前   
    1370    0

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

    考试说明:2020年秋期电大把该网络课纳入到“国开平台”进行考核,该课程共有4个形考任务,针对该门课程,本人汇总了该科所有的题,形成一个完整的标准题库,并且以后会不断更新,对考生的复习、作业和考...

    4年前   
    671    0

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

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

    4年前   
    482    0

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

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

    4年前   
    795    0

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

    “爱课程网络课程”大作业摘要:随着科学技术的不断发展,花卉栽培应用与养护技术也得到了很多改善和拓展,人们更加注意营造一个良好的生活环境,室内花卉一年四季生机盎然,始终享受到春天的生机。室内绿化...

    2年前   
    571    0

    计算机网络编程课程设计

    课题一:基于TCP的Socket通讯编程一、 课程设计目的:1. 能够深刻了解socket编程思想;2. 从实现层面理解TCP和UDP链接的不同。二、 课程设计环境:1. windows XP...

    3年前   
    549    0

    网络推广服务协议

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

    6年前   
    5029    0

    交叉作业安全协议

    交叉作业安全协议 1、      目的 1、因**金源人力资源服务有限公司(以下简称甲方)与**顺通物流运输公司(以下简称乙方)在八钢区域内部分工作存在交叉作业问题,为更好的保证员工工作安...

    11年前   
    12085    0

    文档贡献者

    文***享

    贡献于2020-11-09

    下载需要 5 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档