基於字元介面的聊天程式1 0

2021-07-10 05:03:47 字數 3562 閱讀 3165

編譯器:vs2013 community (vc6.0 執行亦可,但要注意函式的更新,如更安全的函式,etc)

伺服器端程式流程:

1、載入套接字型檔

2、建立套接字(socket)。

3、將套接字繫結到乙個本地位址和埠上(bind)。

4、將套接字設為監聽模式,準備接收客戶請求(listen)。

5、等待客戶請求到來;當請求到來後,接受連線請求,返回乙個新的對應於此次連線的套接字(accept)。

6、用返回的套接字和客戶端進行通訊(send/recv)。

7、返回,等待另一客戶請求。

8、關閉套接字。

客戶端程式流程:

1、載入套接字型檔

2、建立套接字(socket)。

3、向伺服器發出連線請求(connect)。

4、和伺服器端進行通訊(send/recv)。

5、關閉套接字。

伺服器端**:

#include

#include

void main()

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

hibyte(wsadata.wversion) != 2)

/******************建立套接字*******************/

socket socksrv = socket(af_inet, sock_stream, 0);

/*****************繫結套接字********************/

sockaddr_in addrsrv;       //定義 位址結構體 變數addrsrv

addrsrv.sin_addr.s_un.s_addr = htonl(inaddr_any);

addrsrv.sin_family = af_inet;

addrsrv.sin_port = htons(6800);

bind(socksrv, (sockaddr*)&addrsrv, sizeof(sockaddr));

/****************設定監聽模式********************/

listen(socksrv, 5);//引數2:等待連線佇列的最大值

char recvbuf[100];

char sendbuf[100];

char tempbuf[200];

/***********等待客戶連線請求到來,並接受**********/

sockaddr_in addrclient;

int len = sizeof(sockaddr);

socket sockconn = accept(socksrv, (sockaddr*)&addrclient, &len);

while (1)

sprintf(tempbuf, "%s say %s.", inet_ntoa(addrclient.sin_addr), recvbuf);//將得到的資料格式化 放到tempbuf中

printf("%s\n", tempbuf);//輸出客戶端資訊

printf("server say: ");

gets(sendbuf);//從標準輸入流中獲取一行資料,回車後放入sendbuf中

send(sockconn, sendbuf, strlen(sendbuf) + 1, 0);

}closesocket(socksrv);//關閉套接字

wsacleanup();//終止對套接字型檔的使用

}

客戶端**:

#include

#include

void main()

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

hibyte(wsadata.wversion) != 2)

/******************建立套接字*******************/

socket sockclient = socket(af_inet, sock_stream, 0);

/************向伺服器發出connect請求**************/

sockaddr_in addrsrv;

= inet_addr("192.168.1.111");

addrsrv.sin_addr.s_un.s_addr = inet_addr("127.0.0.1");//將點分十進位制轉換成ulong型別

addrsrv.sin_family = af_inet;

addrsrv.sin_port = htons(6800);

connect(sockclient, (sockaddr*)&addrsrv, sizeof(sockaddr));

char recvbuf[100];

char sendbuf[100];

char tempbuf[200];

/************和伺服器進行通訊**********/

int len = sizeof(sockaddr);

while (1)

sprintf(tempbuf, "%s say %s.", inet_ntoa(addrsrv.sin_addr), recvbuf);

printf("%s\n", tempbuf);

}closesocket(sockclient);//關閉套接字

wsacleanup();//終止對套接字型檔的使用

}

注意事項:(我走過的彎路!!!)

1、在服務、客戶兩端,project->設定->linker,增加ws2_32.lib庫

2、可以取消sdl檢查(根據編譯器不同自行選擇)

3、服務端用於接收客戶端資料的套接字sockconn要在while迴圈外

4、用於監聽的套接字socksrv與接收資料的套接字sockconn不同

執行效果圖:

C 基於介面的排序

需要注意的是int32,int16 string,decimal等資料型別已經實現了icomparable介面 因此對於複雜的資料型別進行排序的時候才考慮讓資料型別繼承自icomparable介面。icomparable介面只有乙個方法compareto。因此還要實現compareto方法。comp...

基於UDP簡單聊天程式

server.c include include include include include include include include include include define server port 8888 define max msg size 1024 void udps re...

基於C 的聊天程式

1.引言 1.1目的 編寫詳細設計說明書是軟體開發過程必不可少的部分,其目的是為了在完成需求分析說明書的基礎上完成需求分析說明規定的各項模組的具體實現的設計工作。1.2定義 套接字socket 網路上的兩個程式通過乙個雙向的通訊連線實現資料的交換,這個連線的一端稱為乙個socket。tcp協議 tc...