剖析:伺服器程式(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已經成為真正的資訊高速公路。從實際工程應用角度出發,以計算機網路原理為指導,結合當前網路中的一些常用...