個人聊天程式之伺服器端

2021-10-02 07:14:16 字數 4177 閱讀 5195

多執行緒makefile

shell指令碼

建立套接字、繫結ip和埠、進入監聽模式

"這段**包含了建立套接字、繫結ip和埠、進入監聽模式這三個過程"

//建立乙個新的套接字if(

(sockfd =

socket

(af_inet, sock_stream, ipproto_tcp ))==

-1) cout <<

"socket..."

<< endl;

opt = so_reuseaddr;

setsockopt

(sockfd,sol_socket,so_reuseaddr,

&opt,

sizeof

(opt));

//設定本機的位址

memset

(&servaddr,0,

sizeof

(servaddr));

servaddr.sin_family = af_inet;

servaddr.sin_addr.s_addr =

htonl

(inaddr_any)

; servaddr.sin_port =

htons

(6666);

//bind()if(

bind

(sockfd,

(struct sockaddr*

)&servaddr,

sizeof

(servaddr))==

-1) cout <<

"bind....."

<< endl;

//listen()if(

listen

(sockfd,10)

==-1)

cout <<

"listen..."

<< endl;

此時會進入阻塞模式,直到有tcp請求。接收到請求後建立連線,產生乙個新的socket(原來的套接字可以繼續使用accept來接收新的請求。)

"這段**主要介紹的功能是連線到客戶端,並建立使用者,傳入到新的執行緒當中"

//等待客戶機的連線秦請求

printf

("*****=waiting for client's request*****=\n");

while(1

)}//等待連線後接受if(

(user[toconnect]

.connfd =

accept

(sockfd,

(struct sockaddr*

)&addr,

(socklen_t*

)&sin_size))==

-1)//在可用連線端建立使用者

printf

("create user at no.%d\n"

,toconnect)

;//建立乙個使用者與之對應

memcpy((

void*)

&user[toconnect]

.addr,

&addr,

sizeof

(addr));

user[toconnect]

.online=1;

//獲取使用者名稱

n =read

(user[toconnect]

.connfd, buff, maxline)

; buff[n]

='\0'

;strcpy

(user[toconnect]

.name,buff)

;//開闢乙個執行緒傳入使用者引數

int ret =

pthread_create

(&tids[toconnect]

,null

, chatwithme,

(void*)

&user[toconnect]);

if(ret !=0)

connected++

;//pthread_join(tids[toconnect],null);

//使用者數量到達上限

if(connected==maxclient)}}

}

此時可以對新的套接字進行讀寫操作,來實現傳送和接收訊息的方式,這裡需查詢是否收到訊息,所以需要單獨建立乙個執行緒來處理。

"注釋寫的比較詳細了"

//開闢單獨的聊天執行緒

void

*chatwithme

(void

*ar**)

//列印控制台資訊

sprintf

(str,

"user:%s time:%d:%d:%02d: message:%s"

,user->name,p->tm_hour,p->tm_min,p->tm_sec, buff)

;printf

("%s"

,str)

;

user->m.

lock()

; user->

messagehandle

(buff)

; user->m.

unlock()

;}}//斷開後

user->online=-1

; connected--

;close

(user->connfd)

; user->connfd=0;

return0;

}

close

(sockfd)

;

接收到結束的訊息後來關閉socket

多執行緒在這裡的應用其實很簡單,只要在accept阻塞結束,將新建立的套接字傳入到新的執行緒中,就可以實現對該套接字的讀寫了。

pthread_t ctr;
void

*ctrl

(void

*ar**)

第四個引數是乙個空指標,也可以自己建立對應的指標,但是傳入的方式必須是void*型別的,可以在傳入執行緒之後再轉換回來。

//開闢乙個執行緒作為控制台程式

int ret =

pthread_create

(&ctr,

null

, ctrl,

(void*)

null);

if(ret !=0)

makefile就比較基礎了

不介紹,自己看下也能看懂。

一鍵編譯清理+編譯+執行

#!

/bin/bash

date

echo ""

echo "clean"

make clean

echo ""

echo "rebulid"

make

echo ""

echo "run"

.

socket伺服器端

伺服器 include winsock2.h include string.h include stdio.h include time.h include stdarg.h include stdlib.h pragma comment lib,ws2 32 void errexit const ...

kerberos伺服器端

1.安裝tcl wget tar zvxf tcl8.5.12 src.tar.gz cd tcl8.5.12 cd unix configure make make install 3.解壓 tar xvf krb5 1.10.3 signed.tar tar zvxf krb5 1.10.3.t...

C tcp伺服器端

伺服器端 include stdafx.h include winsock2.h pragma comment lib,ws2 32.lib include using namespace std int tmain int argc,char ar 建立套接字 sserver socket af ...