聊天小程式(五)客戶端退出

2021-10-03 03:39:16 字數 3723 閱讀 7677

需求:客戶端斷開連線後,能保證下次連線正常。

解決方法:當客戶端斷開後,服務端從鍊錶中刪除該節點。當客戶端重新連線時,則重新插入到鍊錶中。

server.c:

#include #include #include #include #include #include #include #include #include #include #include #include #include "base.h"

#define listenq 2 //最大監聽佇列

#define port 5000 //監聽埠

static int maxi = 0; //maxi表示當前client陣列中最大的使用者的i值

typedef struct socknode socknode;

struct socknode

;socknode socklist; // 全域性的套接字鍊錶

void initlist(socknode *socklist)

void insertlist(socknode *socklist, int new_fd) //頭部插入鍊錶

p->pnext = socknew;

}void transmit(socknode *sock, message mess)

}void exitclient(socknode *sock)

socknew = socknew->pnext;

}mess.sig_event = sig_client_quit_succeed;

if((send(sock->fd, (char *)&mess, sizeof(mess), 0))==-1)

maxi = maxi - 1;

if(maxi < 0)

exit(1);

}void recvandsend(void) //監聽**執行緒入口函式

if(mess.sig_event == sig_trasmit_message)

if(mess.sig_event == sig_client_quit)}}

}pthread_exit(null);

exit(1);

}int closeconnection(int sockfd)

int connectsucceeddmess(int sockfd)

int main(int argc, char *ar**)

/* 伺服器端開始建立 socket 描述符 */

if((sockfd = socket(af_inet,sock_stream,0))==-1)

/* 伺服器端填充 sockaddr 結構 */

bzero(&server_addr,sizeof(struct sockaddr_in));

server_addr.sin_family=af_inet;

server_addr.sin_addr.s_addr=htonl(inaddr_any);

server_addr.sin_port=htons(port);

/* ** sockfd 描述符 */

if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)

printf("server port : %d ... ...\n",port);

/* 監聽 sockfd 描述符 */

if(listen(sockfd,listenq)==-1)

thr_id = pthread_create(&p_thread, null, recvandsend, null);

while(1)

}else

else}}

}close(sockfd);

exit(0);

}

client.c:

#include #include #include #include #include #include #include #include #include #include #include #include "base.h"

#define true 1

#define port 5000

static int sockfd;

static int set_name_falg = 1;

char name[100];

void closeclient()

}void* recvfromserver() //接受伺服器訊息執行緒入口函式

if(mess.sig_event == sig_trasmit_message)

if(mess.sig_event == sig_client_quit_succeed)

if(mess.sig_event == sig_refuse_client_connect)

}pthread_exit(null);

exit(0);

}int sendmessage(char *buffer, int sig_type)

int main(int argc, char *ar**)

snprintf(strhost, 32, "%s", "10.47.181.159");

printf("the server ip address : [%s]", strhost);

if((host = gethostbyname(strhost)) == null)

/* 客戶程式開始建立 sockfd 描述符 */

printf("connection ... ...\n");

if((sockfd = socket(af_inet,sock_stream,0)) == -1)

/* 客戶程式填充服務端的資料 */

bzero(&server_addr,sizeof(server_addr));

server_addr.sin_family=af_inet;

server_addr.sin_port=htons(port);

server_addr.sin_addr=*((struct in_addr *)host->h_addr);

/* 客戶程式發起連線請求 */

if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)

sleep(1);

thr_id = pthread_create(&p_thread, null, recvfromserver, null);

sleep(1);

printf("\nnotice: press quit or q or q disconnect server!\n\n");

while(1)

printf("input message : ");

memset(&buffer, 0, sizeof(buffer));

gets(buffer);

if(strcmp(buffer,"quit")==0 || strcmp(buffer,"q")==0 || strcmp(buffer,"q")==0)

if(sendmessage(buffer, sig_trasmit_message) != 0)

} close(sockfd);

exit(0);

}

智慧型預判 (五 客戶端戰鬥 模擬)

用 licecap 錄製 發現 幀數 好低啊。其實 demo執行 都在100幀以上的。好了,不糾結上面的 幀數問題。這個戰鬥系統,模擬了 對戰的過程,其中包含,打人和被打。打人,可以讓對方 少血,同時打人的前提是 蓄力。藍色部分。打中人物 還可以讓他 速度有影響,這裡暫時沒做。被打,被打 就 很 精...

簡單的Socket聊天程式(客戶端)

using system using system.windows.forms using system.net using system.net.sockets namespace socketclient stathread public static void main string args...

聊天室客戶端

from socket import import os,sys 傳送訊息 def send msg s,name,addr while true text input 發言 if text quit msg q name s.sendto msg.encode addr sys.exit 退出聊天...