A. 如何編程使上位機(界面c#)與下位機(單片機keil c)通過TCP/UDP協議來實現通信,最好有源代碼,謝謝~~
看來兄弟是想用單片機弄網路終端啊,但是你的問題描述不夠精準, 如果你是想單片機和PC之間實現ip/tcp方式通訊, 那麼在單片機端有支持這一協議可以和串口連接的的晶元, PC端的程序實際上你沒必要求什麼源碼, 有源碼你也不見得編譯過去, 這個看看C#關於網路編程的幾步走就行了, 很簡單的. 這個方式實際最後還是單片機的串口在起作用, 但是好處是可以遠距離和多設備通信, 不知道這個是不是你的本意, 如果你僅僅是為了完成實驗想要實現單片機和winform的通訊那麼沒必要非用tcp協議, 串口還是很方便的, 你可以winform端綁定一個埠, 然後用VSPM虛擬串口軟體來與單片機通訊, 外設就稍多了.希望我的回答可以幫到你, 不明白的可以追問!
B. 要學好網路編程 需要學什麼
網路編程兩方面,你是說的那個方面?
1.網頁方面:
學習:ASP.NET,還有一些新興的Ajax, MVC。。。另外HTML,javascript,DHTML也要熟悉,HTML5可以了解一下。
2.網路通信方面
學習.NET Socket/Winsock 2等就是那些TCP/IP的東西,還有一些網路架構的知識,對硬體知識也要有所了解。
C. c語言訪問伺服器
lz要先知道什麼是socket,它是TCP/IP協議的API。再上層是http udp之類傳輸報文協議。而什麼是伺服器,如你所說tomcat伺服器,他是一個http(s)伺服器。處理由客戶發送的HTTP報文。並返回報文給客戶。
簡單來說,http就是socket的一個封裝。所以c語言使用socket理所當然能訪問任何伺服器。至於使用什麼格式,你可以看看HTTP報文格式。
D. 關於用C語言開發一個簡單的區域網聊天軟體
Linux系統都是C寫的 用C當然行得通
就是個socket編程嘛
我們原來做過一個的原理描述 當然 這個是C\S模式的 其實你可以做成 無服務端的
本系統具有區域網聊天功能。採用了C\S模式(即伺服器創建套接字後,轉換為監聽套接字,一直在監聽是否由客戶端的請求。伺服器接收到相應的請求後,進行相應的處理)。採用了TCP/IP(面向連接)協議。運用了SOCKET套接字實現了很方便的訪問TCP/IP協議。多線程的操作。
伺服器的程序(簡述):
創建socket-->bind()-->listen()-->accept()-->recv/send()-->close();
客戶端的程序(簡述):
創建scoket-->發送connect-->recv/send()-->close();
E. c網路編程里的sendto函數會講內容發送幾次或者嘗試發送幾次是什麼機制
只發送1次。
不會嘗試重發。
UDP發送,只要扔到網路里就算成功,不管對方是否收到。
F. 在windows下用C語言如何實現socket網路編程,需要用到哪些頭文件或者庫
需要用到的頭文件包含:
#include <winsock2.h>
#include <windows.h>
與Linux環境下socket編程相比,windows環境多了一個步驟:啟動或者初始化winsock庫
Winsock,一種標准API,一種網路編程介面,用於兩個或多個應用程序(或進程)之間通過網路進行數據通信。具有兩個版本:
Winsock 1:
Windows CE平台支持。
頭文件:WinSock.h
庫:wsock32.lib
Winsock 2:
部分平台如Windows CE貌似不支持。通過前綴WSA可以區別於Winsock 1版本。個別函數如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都屬於Winsock 1.1規范的函數;
頭文件:WinSock2.h
庫:ws2_32.lib
mswsock.h用於編程擴展,使用時必須鏈接mswsock.dll
(6)cudp網路編程擴展閱讀
winsock庫的載入與卸載:
載入:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
載入成功,返回值為0。
WORD wVersionRequested:載入的winsock版本,使用宏MAKEWORD(x, y),x表示高位元組,y表示低位元組。然而使用時MAKEWORD(2, 2)。高位元組與低位元組相同~~
LPWSADATA lpWSAData:WSADATA結構的指針,傳入參數後,系統幫助我們填充版本信息。有興趣的可以看看結構體內容,不過基本用不著。
卸載:int WSACleanup(void);比起載入,卸載的函數真是輕松愉快。
G. c#網路編程UDP例子
usingSystem;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Text;
usingSystem.Threading;
usingSystem.Windows.Forms;
namespaceUDPClient
{
publicpartialclassfrmUdp:Form
{
privateUdpClientsendUdpClient;
;
publicfrmUdp()
{
InitializeComponent();
IPAddress[]ips=Dns.GetHostAddresses("");
tbxlocalip.Text=ips[2].ToString();
intport=51883;
tbxlocalPort.Text=port.ToString();
tbxSendtoIp.Text=ips[2].ToString();
tbxSendtoport.Text=port.ToString();
}
//接受消息
privatevoidbtnReceive_Click(objectsender,EventArgse)
{
//創建接收套接字
IPAddresslocalIp=IPAddress.Parse(tbxlocalip.Text);
IPEndPointlocalIpEndPoint=newIPEndPoint(localIp,int.Parse(tbxlocalPort.Text));
receiveUpdClient=newUdpClient(localIpEndPoint);
ThreadreceiveThread=newThread(ReceiveMessage);
receiveThread.Start();
}
//接收消息方法
privatevoidReceiveMessage()
{
IPEndPointremoteIpEndPoint=newIPEndPoint(IPAddress.Any,0);
while(true)
{
try
{
//關閉receiveUdpClient時此時會產生異常
byte[]receiveBytes=receiveUpdClient.Receive(refremoteIpEndPoint);
stringmessage=Encoding.Unicode.GetString(receiveBytes);
//顯示消息內容
ShowMessageforView(lstbxMessageView,string.Format("{0}[{1}]",remoteIpEndPoint,message));
}
catch
{
break;
}
}
}
//利用委託回調機制實現界面上消息內容顯示
(ListBoxlistbox,stringtext);
privatevoidShowMessageforView(ListBoxlistbox,stringtext)
{
if(listbox.InvokeRequired)
{
=ShowMessageforView;
listbox.Invoke(showMessageforViewCallback,newobject[]{listbox,text});
}
else
{
lstbxMessageView.Items.Add(text);
lstbxMessageView.SelectedIndex=lstbxMessageView.Items.Count-1;
lstbxMessageView.ClearSelected();
}
}
privatevoidbtnSend_Click(objectsender,EventArgse)
{
if(tbxMessageSend.Text==string.Empty)
{
MessageBox.Show("發送內容不能為空","提示");
return;
}
//選擇發送模式
if(chkbxAnonymous.Checked==true)
{
//匿名模式(套接字綁定的埠由系統隨機分配)
sendUdpClient=newUdpClient(0);
}
else
{
//實名模式(套接字綁定到本地指定的埠)
IPAddresslocalIp=IPAddress.Parse(tbxlocalip.Text);
IPEndPointlocalIpEndPoint=newIPEndPoint(localIp,int.Parse(tbxlocalPort.Text));
sendUdpClient=newUdpClient(localIpEndPoint);
}
ThreadsendThread=newThread(SendMessage);
sendThread.Start(tbxMessageSend.Text);
}
//發送消息方法
privatevoidSendMessage(objectobj)
{
stringmessage=(string)obj;
byte[]sendbytes=Encoding.Unicode.GetBytes(message);
IPAddressremoteIp=IPAddress.Parse(tbxSendtoIp.Text);
IPEndPointremoteIpEndPoint=newIPEndPoint(remoteIp,int.Parse(tbxSendtoport.Text));
sendUdpClient.Send(sendbytes,sendbytes.Length,remoteIpEndPoint);
sendUdpClient.Close();
//清空發送消息框
ResetMessageText(tbxMessageSend);
}
//採用了回調機制
//使用委託實現跨線程界面的操作方式
(TextBoxtextbox);
privatevoidResetMessageText(TextBoxtextbox)
{
//Control.InvokeRequired屬性代表
//如果空間的處理與調用線程在不同線程上創建的,則為true,否則為false
if(textbox.InvokeRequired)
{
=ResetMessageText;
textbox.Invoke(resetMessagecallback,newobject[]{textbox});
}
else
{
textbox.Clear();
textbox.Focus();
}
}
//停止接收
privatevoidbtnStop_Click(objectsender,EventArgse)
{
receiveUpdClient.Close();
}
//清空接受消息框
privatevoidbtnClear_Click(objectsender,EventArgse)
{
this.lstbxMessageView.Items.Clear();
}
}
}
H. 學習網路編程需要具備什麼知識基礎
學習網路編程需要具備計算機基礎知識,以及一些英語基礎,看題主描述是學習過C語言,所以算是有一定基礎的,所以如果想要學習網路編程還是比較容易的。
現在用的比較多的是java,而且java的應用范圍也比較廣,即使後面不從事網路編程,想要做其他編程類的工作也是比較容易的,所以選擇學java可能是個不錯的選擇。網路編程現在是在Windows下應用的比較廣泛,可以先從Windows下學起。
學習網路編程的方式無非兩種一種是自學,一種是去專業的學校學,選擇哪種學習方式,題主可以根據自身的時間及經濟狀況來進行選擇,畢竟適合自己的才是最好的。
I. C# C/S網路編程 由於系統緩存空間不足或列隊已滿,不能執行套接字上的操作
改成以下代碼試試
public void ReceiveMsg()
{
// 啟動非同步接收
IAsyncResult iar = udpReceiveClient.BeginRecevice(
new AsyncCallback(ReceiveCallback),
udpReceiveState);
}
private void ReceiveCallback(IAsyncResult iar)
{
// 繼續非同步接收
ReceiveMsg();
// 完成前一次非同步接收EndReceive處理
UdpState udpReceiveState = iar.AsyncState as UdpState;
//……
}
要注意的是:
1)Socket非同步接收處理過程中用到了.net framework內部線程池,而線程池中線程的數量是有限制的。
2)ReceiveMsg中的 while(true)循環是多餘的
3)ReceiveMsg中的 lock(this) 沒有意義
4)WaitOne, Sleep() 都是多餘的