UDP協議實現聊天小程式

2021-08-29 20:33:53 字數 2965 閱讀 6350

今天我們用之前講解過的udp協議來寫乙個最基礎,最簡單的網路聊天程式。

//我們通過udp協議來實現乙個簡單的網路聊天程式

//這是客戶端的實現

//過程:

// 1.建立套接字

// 2.繫結位址資訊

// 3.向服務端傳送資料

// 4.接受服務端傳送的資料

// 5.關閉socket

#include#include#include#include#include#include#include#includeint main()

//繫結位址資訊,不過在客戶端的時候我們通常不繫結

//因為繫結的話可能會因為一些特殊情況失敗,但是

//客戶端傳送資料的時候使用哪個位址和埠都無所謂

//只要資料能夠傳送成功就可以,所以客戶端時我們一般

//不推薦繫結埠,這樣在傳送資料的時候,作業系統檢測

//到socket還沒有繫結位址,就會自動給他繫結乙個這樣

//繫結方式不會出錯。

//struct sockaddr_in cli_addr;

//sockaddr_in 是乙個結構體解決了sockaddr的缺陷

//裡邊有四個成員變數分別是:

//sin_family 儲存位址族

//sin_port 16位tcp/udp埠號

//sin_addr 32位ip位址

//sin_zeor[8] 我們不會使用到

cli_addr.sin_family=af_inet;

cli_addr.sin_port=htons(9000);

cli_addr.sin_addr.s_addr=inet_addr("192.168.76.130");

socklen_t len=sizeof(struct sockaddr_in);

while(1)

;scanf("%s",buff);

sendto(sockfd,buff,strlen(buff),0,(struct sockaddr*)&cli_addr,len);

//sendto 指向一指定的目的地傳送資料

//第乙個引數是我們套接字操作符

//第二個引數是要傳送的資料

//第三個引數傳送的資料長度

//第四個一般為0,如果緩衝區沒有資料那麼阻塞等待

//第五個指標指向目的套接字的位址

//第六個引數是第五個指標指向的位址長度

////4.接受來自服務端的資料

memset(buff,0x00,1024);//把緩衝區變成0以防剛剛的資料影響現在新接受的資料

ssize_t r_len=recvfrom(sockfd,buff,1023,0,(struct sockaddr*)&cli_addr,&len);

//recvfrom 是通過sock來接受資料的函式

//引數和上邊的相同不過這裡第六個引數也是指標指向緩衝區的長度

//如果成功返回的是接受的位元組數,失敗返回-1

if(r_len<0)

printf("server say:%s\n",buff);

}close(sockfd);

return 0;

}

這是客戶端的程式,服務端和客戶端沒有什麼區別,不過要注意乙個是先發資料,乙個是先收資料,不然兩個程式會同時阻塞卡住。

//這個是udp協議聊天程式的服務端

#include#include#include#include#include#include#include#includeint main()

struct sockaddr_in ser_addr;

ser_addr.sin_family=af_inet;

ser_addr.sin_port=htons(9000);

ser_addr.sin_addr.s_addr=inet_addr("192.168.76.130");

socklen_t len=sizeof(struct sockaddr_in);

int ret=bind(sockfd,(struct sockaddr*)&ser_addr,len);

//bind 函式將所建立的套接字繫結到乙個位址並且賦予乙個埠號

//第乙個引數是套接字描述符,

//第二個引數為要繫結的位址資訊

//第三個引數為位址資訊的長度。

//返回-1代表繫結失敗

if(ret<0)

while(1)

;struct sockaddr_in cli_addr;

len=sizeof(struct sockaddr_in);

ssize_t rlen=recvfrom(sockfd,buff,1023,0,(struct sockaddr*)&cli_addr,&len);

if(rlen<0)

printf("client:%s %d say:%s\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port),buff);

memset(buff,0x00,1024);

scanf("%s",buff);

sendto(sockfd,buff,strlen(buff),0,(struct sockaddr*)&cli_addr,len);

}close(sockfd);

return -1;

}

一定是要弄明白哪個先收哪個先發, 不然可能會出現發了那邊收不到,只有另一邊也發的時候才能收到上乙個對方傳送的資料。

這裡我們還在服務端輸出了,與他對話的客戶端的ip位址和埠號

UDP聊天小程式 多執行緒(Python)

本程式使用了網路測試工具作為另一端聊天工具,自己寫程式實現與網路測試工具的聊天,使用的是本地位址127.0.0.1,也可開一虛擬機器。本專案主要 使用socket進行資訊傳輸 dest ip input 輸入對方ip dest port int input 輸入對方埠 send data input...

UDP聊天小程式 多執行緒(Python)

import socket defsend msg udp socket dest ip input 輸入對方ip dest port int input 輸入對方埠 send data input 輸入訊息 udp socket.sendto send data.encode utf 8 dest...

Python實現聊天小程式

import socket import sys host port 10001 server socket socket.socket socket.af inet,socket.sock stream server socket.setsockopt socket.sol socket,sock...