如何利用UDP协议实现简单的聊天程序? 怎么用C++编写一个基于UDP的简单聊天程序?

\u600e\u4e48\u7f16\u5199\u4e00\u57fa\u4e8eudp\u534f\u8bae\u7684\u804a\u5929\u7a0b\u5e8f

\u7ed9seasons\u8d4b\u4e88\u5e8f\u5217\u503c

\u7ed9\u53d8\u91cftest\u52a01

\u7ed9my namespage \u8d4b\u4e88\u4e00\u4e2a\u53d8\u91cfbgColor,\u4e0b\u9762\u53ef\u4ee5\u901a\u8fc7my.bgColor\u6765\u8bbf\u95ee\u8fd9\u4e2a\u53d8\u91cf

\uff01

\u9996\u5148\u58f0\u660e\u4e0b\uff0c\u4e0b\u9762\u7684\u7b54\u6848\u662f\u4ece\u535a\u5ba2\u4e0a\u7c98\u8fc7\u6765\u4e86\uff0c\u56e0\u4e3a\u4ee5\u524d\u81ea\u5df1\u5199\u7684\u65f6\u5019\u4e5f\u53c2\u8003\u8fd9\u4e2a\u5199\u7684\u3002
\u57fa\u4e8eUDP\u7684\u804a\u5929\u7a0b\u5e8f\u670d\u52a1\u5668\u7aef\u6e90\u7a0b\u5e8f\uff1a

#include "winsock2.h"
#include "stdio.h"

void main()
{
//\u52a0\u8f7d\u5957\u63a5\u5b57\uff08winsock\uff09\u5e93\uff0c\u52a0\u8f7d\u8fd9\u6bb5\u4ee3\u7801\u62f7\u8d1d\u4e8eMSDN\u4e2dWSAStartup\u7684\u4ecb\u7ecd
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 ); //\u7248\u672c\u53f7\u4e3a1.1

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}

//\u521b\u5efa\u5957\u63a5\u5b57
//\u6ce8\u610f\u7b2c\u4e8c\u4e2a\u53c2\u6570\u548cTCP\u8bbe\u7f6e\u4e0d\u540c
SOCKET sockServer=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrServer; //\u8bbe\u7f6e\u670d\u52a1\u5668\u7aef\u5957\u63a5\u5b57\u7684\u5730\u5740\u7ed3\u6784\u7684\u76f8\u5173\u5c5e\u6027
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //\u8bbe\u7f6eIP
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); //\u8bbe\u7f6e\u7aef\u53e3\u53f7

//\u5c06\u5957\u63a5\u5b57\u548c\u670d\u52a1\u5668\u5730\u5740\u7ed3\u6784\u7ed1\u5b9a
bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100];
char tempBuf[100];
char sendBuf[100];

while(1)
{
//\u4ece\u5ba2\u6237\u7aef\u63a5\u6536\u6570\u636e
int result=recvfrom(sockServer,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
if(result==SOCKET_ERROR)
{
int errCode=WSAGetLastError();
printf("error:%d",errCode);
break; //\u9000\u51fa\u5faa\u73af
}
else
{
if(recvBuf[0]=='q') //\u5bf9\u65b9\u8bf7\u6c42\u9000\u51fa
{
//\u540c\u6837\u5c06\u9000\u51fa\u8bf7\u6c42\u53d1\u9001\u56de\u53bb
sendto(sockServer,"q",strlen("q")+1,0,(SOCKADDR*)& addrClient,sizeof(SOCKADDR));
printf("the chat end!");
break;
}
else
{
//\u5c06\u5bf9\u65b9\u53d1\u9001\u8fc7\u6765\u7684\u4fe1\u606f\u524d\u6bb5\u52a0\u4e0aIP\u5730\u5740\u8fdb\u884c\u8f93\u51fa
sprintf(tempBuf,"%s said:%s",inet_ntoa(addrClient.sin_addr),recvBuf);
printf("%s\n",tempBuf);

//\u5c06\u7528\u6237\u7684\u952e\u76d8\u8f93\u5165\u53d1\u9001\u5230\u5bf9\u65b9
printf("pleas input the message:\n");
gets(sendBuf); //\u5f97\u5230\u952e\u76d8\u8f93\u5165\u5185\u5bb9 sendto(sockServer,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)& addrClient,sizeof(SOCKADDR));
}
}
}

closesocket(sockServer);
WSACleanup();
}

\u57fa\u4e8eUDP\u7684\u804a\u5929\u7a0b\u5e8f\u5ba2\u6237\u7aef\u7aef\u6e90\u7a0b\u5e8f\uff1a
#include "winsock2.h"
#include "stdio.h"

void main()
{
//\u52a0\u8f7d\u5957\u63a5\u5b57\uff08winsock\uff09\u5e93\uff0c\u52a0\u8f7d\u8fd9\u6bb5\u4ee3\u7801\u62f7\u8d1d\u4e8eMSDN\u4e2dWSAStartup\u7684\u4ecb\u7ecd
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 ); //\u7248\u672c\u53f7\u4e3a1.1

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}

//\u521b\u5efa\u5957\u63a5\u5b57
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); //\u6ce8\u610f\u7b2c\u4e8c\u4e2a\u53c2\u6570\u548cTCP\u8bbe\u7f6e\u4e0d\u540c

SOCKADDR_IN addrServer; //\u670d\u52a1\u5668\u5730\u5740\u7ed3\u6784
addrServer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); //\u670d\u52a1\u5668\u5730\u5740
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); //\u670d\u52a1\u5668\u7aef\u53e3\u53f7

char tempBuf[100];
char recvBuf[100];
char sendBuf[100];

int len=sizeof(SOCKADDR);

while(1)
{
printf("plese input the message:\n");
gets(sendBuf); //\u5f97\u5230\u7528\u6237\u7684\u952e\u76d8\u8f93\u5165
sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));

int result=recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrServer,&len);
if(result==SOCKET_ERROR)
{
int errCode=WSAGetLastError();
printf("error:%d",errCode);
break; //\u9000\u51fa\u5faa\u73af
}
else
{
if(recvBuf[0]=='q') //\u5bf9\u65b9\u8bf7\u6c42\u9000\u51fa
{
//\u540c\u6837\u5c06\u9000\u51fa\u8bf7\u6c42\u53d1\u9001\u56de\u53bb
sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
printf("the chat end!");
break;
}
else
{
//\u5c06\u5bf9\u65b9\u53d1\u9001\u8fc7\u6765\u7684\u4fe1\u606f\u524d\u6bb5\u52a0\u4e0aIP\u5730\u5740\u8fdb\u884c\u8f93\u51fa
sprintf(tempBuf,"%s said:%s",inet_ntoa(addrServer.sin_addr),recvBuf);
printf("%s\n",tempBuf);
}
}

}

closesocket(sockClient);
WSACleanup();
}

在VB中利用UDP协议编写聊天程序
   

UDP 协议是一种无连接协议,两台计算机之间的数据传输类似于传递邮件:消息从一台计算机发送到另一台计算机,但是两者之间没有明确的连接。
   由于UDP 协议不需要显式的连接,就需要在两个Winsock控件中间发送数据,关键需要完成以下的三步:
   1.将RemoteHost属性设置为另一台计算机的名称。
   2.将RemotePort属性设置为第二个控件的LocalPort属性。
   3.调用Bind方法,指定使用的LocalPort。
   因为两台计算机的地位可以看成“对等的”,这种应用程序也被称为点对点的应用程序。
   下面将创建一个聊天应用程序,两个人可以通过它进行实时的交谈。请按照以下步骤制作:
   1.创建一个新的 Standard EXE 工程。将缺省的窗体的名称修改为frmPeerA,将窗体的标题修改为“Peer A”。
   2.在窗体中放入一个 Winsock 控件,并将其命名为 udpPeerA。在“属性”页上,单击“协议”并将协议修改为 UDPProtocol。
   3.在窗体中添加两个 TextBox 控件。将第一个命名为 txtSend,第二个命名为 txtOutput。
   4.为窗体添加如下的代码。
   Private Sub Form_Load()
   ′控件的名字为udpPeerA
   With udpPeerA
   ′重点:必须将 RemoteHost 的值修改为对方计算机的名字。
   RemoteHost= ″PeerB″
   RemotePort = 1001 ′连接的端口号。
   Bind 1002 ′绑定到本地的端口。
   End With
   frmPeerB.Show′显示第二个窗体。
   End Sub
   Private Sub txtSend_Change()
   ′在键入文本时,立即将其发送出去。
   udpPeerA.SendData txtSend.Text
   End Sub
   Private Sub udpPeerA_DataArrival _
   (ByVal bytesTotal As Long)
   Dim strData As String
   udpPeerA.GetData strData
   txtOutput.Text = strData
   End Sub
   要创建第二个 UDP 伙伴,请按照以下步骤执行:
   1.在工程中添加一个标准窗体,将窗体的名字修改为 frmPeerB,将窗体的标题修改为“Peer B”。
   2.在窗体中放入一个 Winsock 控件,并将其命名为 udpPeerB。
   3.在“属性”页上,单击“协议”并将协议修改为“UDPProtocol”。
   4.在窗体上添加两个 TextBox 控件。将第一个命名为 txtSend,第二个命名为 txtOutput。
   5.在窗体中添加如下代码
   Private Sub Form_Load()
   ′控件的名字为 udpPeerB。
   With udpPeerB
   ′重点:必须将RemoteHost的值改为对方计算机的名字。
   RemoteHost= ″PeerA″
   RemotePort = 1002 ′要连接的端口。
   Bind 1001 ′绑定到本地的端口上。
   End With
   End Sub
   Private Sub txtSend_Change()
   ′在键入后立即发送文本。
   udpPeerB.SendData txtSend.Text
   End Sub
   Private Sub udpPeerB_DataArrival _
   (ByVal bytesTotal As Long)
   Dim strData As String
   udpPeerB.GetData strData
   txtOutput.Text = strData
   End Sub
   运行工程,然后在两个窗体的txtSend TextBox中分别键入一些文本。键入的文字将出现在另一个窗体的 txtOutput TextBox中。

bool done = false;

private const int listenPort = 11000; //设置端口

private void StartListener()

{

UdpClient listener = new UdpClient(listenPort); 使用UDP协议

IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort); //任意IP,

try

{

while (!done)//使用永真循环另其一直处于监听状态

{

byte[] bytes = listener.Receive(ref groupEP);

string strIP;

strIP ="信息来自"+ groupEP.Address.ToString();//获得发信人的IP

string strInfo=Encoding.GetEncoding("gb2312").GetString(bytes, 0,

bytes.Length);//获得信息

MessageBox.Show(strInfo, strIP);

}

}

catch (Exception e)

{

Console.WriteLine(e.ToString());

}

finally

{

listener.Close();

}

}

服务器端窗体加载时,调用StartListenter方法开启监听,实现代码如下:

private void frmServer_Load(object sender, EventArgs e)

{

this.Hide();//隐藏服务器端窗体

StartListener(); //调用监听方法

}

客户端实现的具体步骤如下:

(1)在VS2005项目中添加一个窗体。

(2)在窗体中添加两个TextBox文本框,分别用于获得IP信息与发送信息。

(3)在窗体中添加两个Button按钮和两个Label标签,它们分别用于激发事件和显示信息。

(4)程序主要代码如下。

public void Send()

{

Socket s = new Socket(AddressFamily.InterNetwork,

SocketType.Dgram,ProtocolType.Udp);//实例化Socket对象

//为了起到广播的作用、IP可以设在一个段内如.168.1.255

IPAddress broadcast = IPAddress.Parse(this.textBox2.Text.ToString());

byte[] sendbuf =

Encoding.GetEncoding("gb2312").GetBytes(this.textBox1.Text.ToString());

IPEndPoint ep = new IPEndPoint(broadcast, 11000);

s.SendTo(sendbuf, ep);//发送信息

}

你要用什么语言做啊???



  • ...涓嶈兘瀹炵幇涓涓鍙e彿鍚屾椂鍚戜袱涓鍙e彿鍙戦佹秷鎭?涓嶇煡濡備綍瀹炵幇,璇...
    绛旓細浣跨敤DatagramSocket鍜孌atagramPacket 鍏朵腑DatagramSocket浣跨敤涓涓彂閫佺殑绔彛鍙 DatagramPacket鐨勫弬鏁 DatagramPacket(bytes[] bytes,int bytes[].length,InetAddress ip, int port);閲岀殑port灏辨槸鐩爣绔彛 瑕佸悜涓や釜绔彛鍙峰彂閫侊紝闇瑕佸垱寤轰袱涓狣atagramPacket锛屽垎鍒~鍐欎袱涓狪P鍦板潃鍜岀鍙e彿锛屽苟鐢―atagramSocket鍙戦併傚彟...
  • qq鑱婂ぉ浼犺緭鏄鐢╱dp鎬庝箞瀹炵幇楠岃瘉
    绛旓細1銆UDP棣栭儴鍓嶆坊鍔12瀛楄妭鐨勪吉棣栭儴銆2銆16bit涓哄瓧闀胯繘琛屽弽鐮佹眰鍜屻3銆佸垽鏂牎楠岀粨鏋滄槸鍚︿负0xFFFF銆4銆佹楠岀粨鏋滀负0xFFFF锛岄獙璇侀氳繃銆
  • 涓や汉閫氳繃YY鑱婂ぉ,閫氳繃鐨勬槸tcp杩樻槸UDP鍗忚
    绛旓細杩欏厖鍒嗚鏄庝簡UDP鍗忚鏄潰鍚戦潪杩炴帴鐨勫崗璁紝娌℃湁寤虹珛杩炴帴鐨勮繃绋嬨傛鍥犱负UDP鍗忚娌℃湁杩炴帴鐨勮繃绋嬶紝鎵浠ュ畠鐨勯氫俊鏁堟灉楂橈紱浣嗕篃姝e洜涓哄姝わ紝瀹冪殑鍙潬鎬т笉濡俆CP鍗忚楂樸俀Q灏浣跨敤UDP鍙戞秷鎭紝鍥犳鏈夋椂浼氬嚭鐜版敹涓嶅埌娑堟伅鐨勬儏鍐点倀cp鍗忚鍜udp鍗忚鐨宸埆 TCP UDP 鏄惁杩炴帴 闈㈠悜杩炴帴 闈㈠悜闈炶繛鎺 浼犺緭鍙潬鎬 鍙潬 涓...
  • 鍒╃敤VB鐨刉insock鎺т欢,閫氳繃UDP鍗忚瀹炵幇涓ゅ彴鏈哄櫒鐨勮亰澶╄繘绋嬬浉浜掍紶閫佹暟鎹殑...
    绛旓細Option Explicit Private Sub Command1_Click()If Text3.Text = "" Then MsgBox "璇疯緭鍏ュ鏂笽P", vbOKOnly, "鎻愮ず"Exit Sub End If If Text2.Text = "" Then MsgBox "璇疯緭鍏ヨ鍙戦佺殑鍐呭", vbOKOnly, "鎻愮ず"Exit Sub End If Winsock1.RemoteHost = Text3.Text Dim a As String 'a = ...
  • QQ鏄鎬庢牱瀹炵幇娑堟伅浼犻掔殑?
    绛旓細涔熷氨鏄弻鏂瑰繀椤婚伒瀹堢浉鍚岀殑鍗忚鎵嶈兘閫氳锛屽嵆鎴戜滑蹇呴』鐢ㄨ吘杩呯粰鎴戜滑鐨勫鎴风鎵嶈兘杩炰笂鑵捐繀鐨勬湇鍔″櫒杩涜鑱婂ぉ銆3.鍥犱负UDP鍗忚鏄笉鍙潬浼犺緭锛屽洜姝ら噰鐢UDP鍗忚鐨淇℃伅鍦ㄤ紶閫佽繃绋嬩腑寰堝鏄撲涪澶憋紝鎵浠Q浣跨敤杈呭姪绠楁硶瀹炵幇鍖呴噸浼犳満鍒朵互淇濊瘉淇℃伅涓嶄細涓㈠け銆傚綋娑堟伅鍦ㄥ鎴烽棿鐩存帴浼犻佹棤娉曞埌杈炬椂灏辨墠浣跨敤TCP鍗忚閫氳繃鏈嶅姟鍣ㄤ腑杞
  • tcp,udp 鐨鍗忚绔彛濡備綍瀹炵幇
    绛旓細涓嶇TCP杩樻槸UDP锛岄兘鍚湁缃戠粶鏈嶅姟蹇呴』鐨勬簮绔彛鍜岀洰鐨勭鍙d俊鎭紝浠ュ缓绔嬪拰瀹炵幇缃戠粶浼犺緭鏈嶅姟銆傝繖鏃讹紝浣犵殑鐤戦棶灏辨潵浜嗭細鏃㈢劧閮界敤浜庝紶杈擄紝涓轰綍瑕佹悶涓や釜涓嶅悓鐨鍗忚鍛紵杩欏氨闇瑕佷粠缃戠粶涓笉鍚屾湇鍔$殑闇姹傛潵璋堣捣銆傚湪缃戠粶涓紝鏈変簺鏈嶅姟锛屽HTTP銆丗TP绛夛紝瀵规暟鎹殑鍙潬鎬ц姹傝緝楂橈紝鍦浣跨敤杩欎簺鏈嶅姟鏃讹紝蹇呴』淇濊瘉鏁版嵁鍖呰兘澶...
  • TCP涓UDP搴旂敤鐨勪緥瀛愭湁鍝簺?
    绛旓細閲囩敤UDP鐨缁忓吀娓告垙濡侳PS娓告垙Quake銆丆S锛岃憲鍚嶇殑娓告垙寮曟搸Unity3D閲囩敤鐨勪篃鏄疪akNet銆傦紙3锛夌墿鑱旂綉 2014骞磄oogle鏃椾笅鐨凬est寤虹珛Thread Group锛屾帹鍑轰簡鐗╄仈缃戦氫俊鍗忚Thread锛屽畬鍠勭墿鑱旂綉閫氫俊銆傚叏鐞冨皢杩50%鐨勪汉閮藉湪浣跨敤浜掕仈缃戯紝浜轰滑涓嶆柇鐨勮拷姹傛洿蹇佹洿濂界殑鏈嶅姟锛屼竴鍒囬兘鍦ㄥ彉鍖栵紝鍦ㄨ秺鏉ヨ秺澶氱殑棰嗗煙锛孶DP灏嗕細鎶㈠崰TCP...
  • 銆愰楦戒紶涔﹁蒋浠躲 椋為附浼犺緭杞欢鍙互灞鍩熺綉鍐呰亰澶,璇烽棶鏄鎬庢牱瀹炵幇...
    绛旓細椋為附浼犱功鐨瀹炵幇鍘熺悊锛氾紙1锛夋渶鍏抽敭鐨勬槸灞鍩熺綉鐢ㄦ埛鍒楄〃鐨勫缓绔嬶紱椋為附鍚姩鏃浣跨敤UDP鍗忚鍚255.255.255.255杩欎釜骞挎挱鍦板潃鍙戦佸箍鎾寘,榛樿绔彛鏄2425銆傚箍鎾寘鍐呭鍖呭惈鐢ㄦ埛鍚嶃佸伐浣滅粍銆佷富鏈哄悕銆両P绛変俊鎭紱宸插惎鍔ㄩ楦界殑鐢ㄦ埛閫氳繃2425绔彛鏀跺埌姝ゅ箍鎾寘鍚庯紝灏变細鍦ㄨ嚜宸辩殑鐢ㄦ埛鍒楄〃涓坊鍔犺繖涓敤鎴风殑鐢ㄦ埛鍚嶃佸伐浣滅粍绛変俊鎭...
  • 鍏充簬UDP鍗忚鐨鐢ㄩ,鐪嬪畬灏辨噦浜
    绛旓細锛堟秷鎭皢浼氫互浠庢湇鍔$鍙戝嚭鐨勯『搴忓彂閫佺粰瀹㈡埛绔紝灏界娑堟伅鍙兘鍒扮綉缁滅殑鍙︿竴绔椂鏄棤椤哄簭鐨勶紝TCP鍗忚浼氫负浣犳帓濂藉簭锛 浣嗘槸鍗充娇UDP涓嶅彲闈狅紝鏃犲簭锛屼絾鏄垜浠彲浠ュ皢杩欎簺瑕佹眰杞Щ缁欎笂灞傚簲鐢ㄦ潵瀹炵幇锛屼笉浠呴檷浣庝簡鎵ц鏃堕棿锛岃屼笖浣胯川閲忓緱鍒颁繚璇併傦紙渚嬪鍙互閫氳繃缁UDP鍗忚浣跨敤搴忓垪鍙峰拰閲嶄紶鏈哄埗鏉ユ敼鍠勫畠鐨勮繖涓や釜缂虹偣锛夈...
  • 鐢Winsock鍐欎竴涓绠鍗曠殑鑱婂ぉ绋嬪簭
    绛旓細鍒涘缓UDP 搴旂敤绋嬪簭姣斿垱寤 TCP 搴旂敤绋嬪簭杩樿绠鍗,鍥犱负 UDP 鍗忚涓嶉渶瑕佹樉寮忕殑杩炴帴銆傚湪涓婇潰鐨 TCP 搴旂敤绋嬪簭涓,涓涓 Winsock 鎺т欢蹇呴』鏄惧紡鍦拌繘琛屸滅洃鍚,鍙︿竴涓繀椤浣跨敤 Connect 鏂规硶鍒濆鍖栬繛鎺ャ俇DP 鍗忚涓嶉渶瑕佹樉寮忕殑杩炴帴銆傝鍦ㄤ袱涓帶浠朵腑闂村彂閫佹暟鎹,闇瑕佸畬鎴愪互涓嬬殑涓夋(鍦ㄨ繛鎺ョ殑鍙屾柟): 灏哛emoteHost 灞炴ц缃负鍙...
  • 扩展阅读:udp协议实现分用 ... udp协议地址如何转化 ... udp协议属于哪一层协议 ... 什么协议基于udp协议 ... udp协议提供端到端服务 ... 常见的udp协议有哪些 ... udp如何实现可靠传输 ... 使用udp的协议有哪些 ... 网络禁止udp协议 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网