socket編程代碼
① C++ SOCKET編程,如何監聽多個埠,比如監聽兩個埠,關鍵代碼該怎麼寫,求教求教,求代碼!
#include<stdio.h>
#include<Winsock2.h>
#include<process.h>
#pragmacomment(lib,"Ws2_32.lib")
unsignedint__stdcalllisteningThread(void*param)
{
SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons((int)param);
intret=bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
ret=listen(sockSrv,5);
SOCKADDR_INaddrClient;
intlen=sizeof(SOCKADDR);
while(1)
{
SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
charsendBuf[]="HelloWorld!";
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
charrecvBuf[50];
recv(sockConn,recvBuf,50,0);
printf("%s ",recvBuf);
closesocket(sockConn);
}
return0;
}
voidmain()
{
WORDwVersionRequested;
WSADATAwsaData;
interr;
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0){
return;
}
_beginthreadex(NULL,0,listeningThread,(void*)8120,0,NULL);
_beginthreadex(NULL,0,listeningThread,(void*)8121,0,NULL);
Sleep(INFINITE);
}
這個是windows平台的,創建兩個線程,分別處理兩個監聽埠,埠通過參數傳進去
② 求C++,socket聊天程序的代碼,最好是實現了兩個客戶端之間經由伺服器的信息互發,聊天功能要完整些
#include <stdio.h>
#include <winsock2.h>
#define MAX_SIZE 200
void main(void) {
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return;
}
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup( );
return;
}
SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
bind(sockSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
SOCKADDR addrClient;
char recvBuffer[MAX_SIZE];
memset(recvBuffer, 0, sizeof(recvBuffer));
int len = sizeof(SOCKADDR);
recvfrom(sockSrv, recvBuffer, sizeof(recvBuffer), 0, (SOCKADDR *)&addrClient, &len);
printf("%s\n", recvBuffer);
closesocket(sockSrv);
}
#include <stdio.h>
#include <winsock2.h>
void main(void) {
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return;
}
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup( );
return;
}
/* The WinSock DLL is acceptable. Proceed. */
SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addrClient;
addrClient.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrClient.sin_family = AF_INET;
addrClient.sin_port = htons(6000);
sendto(sockClient, "你若此生若只如一瞬", strlen("你若此生若只如一瞬"), 0, (SOCKADDR *)&addrClient, sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}
③ 6.Twisted UDP Socket 編程示例
示例:客戶端每隔10秒向服務端報送設備使用情況,具體數據如下:
數據以文本進行傳輸,傳輸格式:Key:Value,中間用冒號分隔。服務端只做數據的原樣顯示並回復"OK!"
由於 UDP 沒有連接的概念,所以大多數情況下,採用 UDP Socket 實現的應用都是由設備採集數據上報到服務上來運行的。
雖然對於 UDP 來說沒有服務端和客戶端的概念,但在實際項目開發中,我們一般還是要區分服務端和客戶端的。對於 UDP 服務端來說,其實代碼很簡單,因為其主要任務就是接收數據,然後對數據進行處理。
先來編寫代碼框架:
代碼中,主要實現的是 datagramReceived 事件,一般在該事件的代碼中就是我們的業務邏輯,示例代碼如下:
客戶端代碼相對比服務端要復雜一點,主要是客戶端需要執行定時任務,這樣的話,我們需要設計一個線程來執行該定時任務,由於線程中需要發送數據到服務端,所以,在線程中需要設計一個屬性指向客戶端的 Protocol。線程的框架代碼如下:
客戶端框架代碼:
線程主要通過 Protocol 發送數據,實現代碼如下:
客戶端 Protocol 代碼實現如下:
在 Protocol 啟動時連接到伺服器,這樣就可以形成 Connected UDP,相對於 UDP 來說,數據的傳輸可靠性有所提高,同時,在代碼中發送數據也不需要寫服務端的地址。
服務端:
客戶端:
④ c# socket編程,如何在有路由器的區域網中,連接另一台主機
下面是示常式序的簡單步驟說明
伺服器端:
第一步:用指定的埠號和伺服器的ip建立一個EndPoint對像;
第二步:建立一個Socket對像;
第三步:用socket對像的Bind()方法綁定EndPoint;
第四步:用socket對像的Listen()方法開始監聽;
第五步:接受到客戶端的連接,用socket對像的Accept()方法創建新的socket對像用於和請求的客戶端進行通信;
第六步:通信結束後一定記得關閉socket;
代碼:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace server
{
class Program
{
static void Main(string[] args)
{
int port = 2000;
string host = "127.0.0.1";
/**////創建終結點(EndPoint)
IPAddress ip = IPAddress.Parse(host);//把ip地址字元串轉換為IPAddress類型的實例
IPEndPoint ipe = new IPEndPoint(ip, port);//用指定的埠和ip初始化IPEndPoint類的新實例
/**////創建socket並開始監聽
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//創建一個socket對像,如果用udp協議,則要用SocketType.Dgram類型的套接字
s.Bind(ipe);//綁定EndPoint對像(2000埠和ip地址)
s.Listen(0);//開始監聽
Console.WriteLine("等待客戶端連接");
/**////接受到client連接,為此連接建立新的socket,並接受信息
Socket temp = s.Accept();//為新建連接創建新的socket
Console.WriteLine("建立連接");
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//從客戶端接受信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
/**////給client端返回信息
Console.WriteLine("server get message:{0}", recvStr);//把客戶端傳來的信息顯示出來
string sendStr = "ok!Client send message successful!";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
temp.Send(bs, bs.Length, 0);//返回信息給客戶端
temp.Close();
s.Close();
Console.ReadLine();
}
}
}
客戶端:
第一步:用指定的埠號和伺服器的ip建立一個EndPoint對像;
第二步:建立一個Socket對像;
第三步:用socket對像的Connect()方法以上面建立的EndPoint對像做為參數,向伺服器發出連接請求;
第四步:如果連接成功,就用socket對像的Send()方法向伺服器發送信息;
第五步:用socket對像的Receive()方法接受伺服器發來的信息 ;
第六步:通信結束後一定記得關閉socket;
代碼:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Client
{
class Program
{
static void Main(string[] args)
{
try
{
int port = 2000;
string host = "127.0.0.1";
/**////創建終結點EndPoint
IPAddress ip = IPAddress.Parse(host);
//IPAddress ipp = new IPAddress("127.0.0.1");
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和埠轉化為IPEndpoint實例
/**////創建socket並連接到伺服器
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//創建Socket
Console.WriteLine("Conneting…");
c.Connect(ipe);//連接到伺服器
/**////向伺服器發送信息
string sendStr = "hello!This is a socket test";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);//把字元串編碼為位元組
Console.WriteLine("Send Message");
c.Send(bs, bs.Length, 0);//發送信息
/**////接受從伺服器返回的信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//從伺服器端接受返回信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
Console.WriteLine("client get message:{0}", recvStr);//顯示伺服器返回信息
/**////一定記著用完socket後要關閉
c.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("argumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException:{0}", e);
}
Console.WriteLine("Press Enter to Exit");
}
}
}
⑤ Java的Socket編程
要通信首先要建立socket鏈接。
1 ab客戶端與服務端建立socket鏈接
2 a客戶端發送消息到服務端
3 服務端收到消息後,發送到指定的b客戶端
4 b客戶端處理來自服務端的消息
⑥ php的socket編程
socket_bind($socket,'127.0.0.1',9000);
伺服器端綁定IP指的是127.0.0.1,就是伺服器本機,監聽9000埠
⑦ 一個關於socket編程的問題,我用vs寫了一個很簡單的客戶端和一個伺服器的程序
伺服器的地址指定伺服器工作的IP地址
客戶端的地址指定所連接的伺服器的IP地址,因此:
兩個都填寫伺服器那台計算機的IP地址即可,埠號保持一致!
⑧ c# socket編程
private void button2_Click(object sender, EventArgs e)
if (s.Connected == true)
try
string abc = textBox3.Text;
s.Send(Encoding.ASCII.GetBytes(abc));
MesageBox.Show("向伺服器發送:" + abc);
catcMessageBox.Show("發送失敗");
接收:
System.Timers.Timer aTimer = new System.Timers.Timer();
byte[] res = new byte[1024];
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIll
aTimer.Elapsed += new ElapsedEventHandler(socket_rev); //定時事件的方法
aimer.Interval = 100;
private void socket_rev(object sender, EventArgs e)
int receiveLength = s.Receive(res, res.Length, SocketFlags.None);
if (receiveLength > 0)
textBox4.Text = Encoding.ASCII.GetString(res, 0, receiveLength);
string abc = "HaveReceive";
s.Send(Encoding.ASCII.GetBytes(abc));
(8)socket編程代碼擴展閱讀:C#Socket非同步通訊學習
思路
1、Socket分為面向連接協議(如TCP)和無連接協議(如UDP)
2、Socket通信分為同步操作模式和非同步操作模式,同步模式在建立連接之前/收到消息之前會阻塞當前進程,非同步模式不會阻塞當前進程
綜合以上兩點,考慮到體驗,當然是選擇非同步Socket啦,另外,這里使用的是面向連接的協議,那麼實現思路大致如下:
1、創建Socket對象
2、綁定IP和埠
3、偵聽連接
4、開始一個非同步操作來接收一個接入的連接請求
5、處理接入的請求
6、向客戶端發送消息
⑨ linux socket程序 求代碼運行結果
ret=write(socket_fd,send_buff,strlen(send_buff));
應該改為:
ret=write(new_socket_fd,send_buff,strlen(send_buff));
accept成功後,所有的操作,都要針對新獲得的句柄來操作,不然會引發錯誤,造成主程序異常退出。
