自製即時通訊系統 socket網路程式設計(2)

2021-06-18 13:47:32 字數 3192 閱讀 9686

剖析:伺服器程式(32位控制台程式)

1.主線程

2.請求連線的套接字緩衝區

(每乙個客戶端的連線請求都會先插入到套接字緩衝區中)

3.偵查執行緒

(迴圈從套接字緩衝區中檢查是否有未處理的套接字,如果有,則建立新的客戶端用例執行緒進行處理,並在緩衝區中刪除該套接字)

4.客戶端用例執行緒

(用來處理連線狀態中的客戶端用例)

(每隔一段時間執行一次,檢驗使用者是否意外離線)

#include "stdafx.h"

#include#include#include#include#include #include #include "msgstruct.h"

#include "mysql.h"

#define ssize_t int

mysql mysql;

unsigned int winapi thread_online_detect(void *vargp);

void sbuf_insert(sbuf_t *sbuf, socket *clntsock, sockaddr_in *servaddr);

unsigned int winapi thread_detect_func(void *vargp);

void rio_readinitb(rio_t *rp, int fd);

int rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen);

int rio_writeline(int fd, void *usrbuf, size_t n, int flags);

int rio_read(rio_t *rp, char *usrbuf, size_t n);

int main()

if ( lobyte( wsadata.wversion ) != 1 ||

hibyte( wsadata.wversion ) != 1 )

socket listensock = socket(af_inet, sock_stream, ipproto_tcp);

if(listensock<0)

struct sockaddr_in servaddr;

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

servaddr.sin_family = af_inet;

servaddr.sin_addr.s_addr=htonl(inaddr_any);

servaddr.sin_port=htons(5556);

if(bind(listensock, (struct sockaddr *)&servaddr, sizeof(servaddr)) <0)

if(listen(listensock, 5)<0)

//初始化套接字緩衝區

sbuf_t sbuf;

sbuf.num=0;

sbuf.first=0;

sbuf.last=-1;

unsigned int thread_online;

_beginthreadex(null, 0, thread_online_detect,null, 0, &thread_online);

unsigned int thread_detect;

_beginthreadex(null, 0, thread_detect_func,(void *)&sbuf, 0, &thread_detect);

for(;;)

else

sbuf_insert(&sbuf, clntsock, servaddr);

}}

請求連線的套接字緩衝區:

管理此緩衝區的有如下兩個:sbuf_insert(),sbuf_remove()//分別向緩衝區中新增或者刪除套接字請求。

void sbuf_insert(sbuf_t *psbuf, socket *clntsock, sockaddr_in *servaddr)

}void sbuf_remove(sbuf_t *psbuf)

偵查執行緒:

unsigned int winapi thread_detect_func(void *vargp)

else

sbuf_remove(psbuf);

} }}

客戶端用例執行緒:處理使用者的登入,註冊,修改資訊,新增好友等各種請求。

關於用例的流程圖,因為比較多,就專門貼在下一帖中:

unsigned int winapi threadfunc(void *vargp)

else

if(head->magic==0x54 && head->flags==0x01)//登陸包

else

return 0;

}else//註冊包

if(head->magic==0x54 && head->flags==0x02)

}else

if(head->magic==0x54 && head->flags==0x04)//修改個人資訊包

else

if(head->flags==0x08)//查詢包

else

if(head->flags==0x10)//新增刪除好友

else

if(head->magic==0x54 && head->flags==0x40)//申請新陌生人資訊

else

if(head->magic==0x54 && head->flags==0x20)//下線通知

else

if(head->magic==0x54 && head->flags==-128)//udp離線訊息入錶

else

} else

}return 1;

}

unsigned int winapi thread_online_detect(void *vargp)

else

else}}

} printf("監測執行緒本次檢查結束...\n");

} return 1;

}

以上**僅作參考。

注意!筆者所寫的伺服器端尚未良好解決對資料庫訪問衝突的問題。

自製即時通訊系統 socket網路程式設計(總結)

前面的章節介紹了大致的實現構架與 本節就我實際編寫過程中的感受做乙個小小的總結吧 一開始選擇這個課題並未對socket程式設計這一塊有過多的了解,由於暑假期間還要實習,時間並不充裕,從開始學習到課題完成總共有乙個半月左右 我的學習歷程 c語言的socket程式設計 花了一兩周時間把書上的示例差不多都...

即時通訊系統

企業擁有一套理想的即時通訊系統,正如找到了一位得心應手的商務秘書。然而,縱觀當前企業即時通訊市場,同質化的即時通訊軟體比比皆是,而能夠讓企業真正根據自身需要來按需定製 人性化開發的即時通訊系統卻少之又少。傳統開發理念讓企業被動使用即時通訊。目前,大多數的軟體提供商還在用傳統的開發理念來開發企業即時通...

即時通訊系統IM

背景 即時通訊 instant messaging 是目前internet上最為流行的通訊方式,各種各樣的即時通訊軟體也層出不窮 服務提供商也提供了越來越豐富的通訊服務功能。不容置疑,internet已經成為真正的資訊高速公路。從實際工程應用角度出發,以計算機網路原理為指導,結合當前網路中的一些常用...