多執行緒程式設計例項 伺服器客戶端簡單通訊

2021-04-30 12:32:51 字數 2438 閱讀 6052

這是乙個非常簡單的通訊程式,不需要什麼前奏來說明這個問題,可以直接來看程式的實現,首先是伺服器端的程式:

int main(int argc, char **argv)

slisten = socket(af_inet, sock_stream, ipproto_ip);

if (slisten == socket_error)

if (binte***ce)

}else

local.sin_family = af_inet;

local.sin_port = htons(iport);

if (bind(slisten,

(struct sockaddr*)&local,

sizeof(local)) == socket_error)

listen(slisten, 8);

while(1)

printf("acceped client: %s:%d/n",

inet_ntoa(client.sin_addr),

ntohs(client.sin_port));

hthread = createthread(null,

0,clientthread,

(lpvoid)sclient,

0,&dwthread);

if (hthread == null)

closehandle(hthread);

}closesocket(slisten);

wsacleanup();

return 0;

}這是主程式,首先是乙個驗證引數的過程,程式提供了三種引數格式:-p:x說的是監聽的埠號,-i:str說的是監聽的ip,這只適用於一台主機多個ip的情況,-o說的是伺服器只接收訊息,而不傳送回應訊息,驗證引數的**如下:

void validateargs(int argc, char **argv)}}

}驗證完引數之後,就開一般的tcp/ip通訊的步驟了,即首先建立乙個socket,然後繫結在伺服器的某個埠上,然後listen進行監聽,最後是accept接收到乙個連線,就建立乙個單獨的執行緒專門與用這個連線和某個客戶端進行通訊,來看看通訊線程的入口函式:

dword winapi clientthread(lpvoid lpparam)

szbuff[ret] = '/0';

printf("recv: %s/n", szbuff);

if (!brecvonly)

nleft -=ret;

idx +=ret;}}

}return 0;

}這就是乙個通訊線程函式,用recv接收資料,用send傳送資料,不是很難。

下面來看看客戶端的實現:

void validateargs(int argc, char *argv)}}

}int main(int argc, char *argv)

strcpy(szmessage, default_message);

sclient = socket(af_inet, sock_stream, ipproto_tcp);

if (sclient == invalid_socket)

server.sin_family = af_inet;

server.sin_port = htons(iport);

server.sin_addr.s_addr = inet_addr(szserver);

if (server.sin_addr.s_addr == inaddr_none)

copymemory(&server.sin_addr,

host->h_addr_list[0],

host->h_length);

}if (connect(sclient,

(struct sockaddr*)&server,

sizeof(server))

== socket_error)

for (i = 0; i < dwcount; i++)

else if (ret == socket_error)

printf("send %d bytes/n", ret);

if (!bsendonly)

else if (ret == socket_error)

szbuffer[ret] = '/0';

printf("recv [%d bytes]: %s/n", ret, szbuffer);}}

closesocket(sclient);

wsacleanup();

return 0;

}客戶端的程式非常的簡單,建立乙個socket,然後connect伺服器,就可以進行recv和send了,不要建立執行緒,很輕鬆的就可以完成通訊了,當然更好的情況是將客戶端的connect單獨放在乙個執行緒裡面進行,在伺服器端,最後也是將accept單獨放在乙個執行緒裡面進行,這樣的話可以更好的響應使用者的操作了。

QT多執行緒伺服器 客戶端

客戶端效果展示 h ifndef dialog h define dialog h include include include include timeserver.h include class dialog public qdialog endif dialog h cpp include ...

客戶端 伺服器程式設計模型

客戶端和伺服器是程序,不是主機。客戶端 伺服器模型中的基本操作是事務。乙個客戶端 伺服器事務由四步組成 1.當乙個客戶端需要服務時,它向伺服器傳送乙個請求,發起乙個事務。例如,當web瀏覽器需要乙個檔案時,它就傳送乙個請求給web伺服器。2.伺服器收到請求後,解釋它,並以適當的方式操作它的資源。例如...

Linux socket程式設計 伺服器 客戶端

根據網上的程式修改的,感謝!另外有個linux網路除錯工具,tcpdump,類似xp上的wireshark,使用介紹 伺服器端 客戶機端 可以實現,客戶機一直傳送,伺服器一直接收資料,原理網上的程式是只發一次。現在這個還有個問題,退出只能ctrl c,如果客戶機先退出,伺服器一直接收資料,不知道什麼...