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成功后,所有的操作,都要针对新获得的句柄来操作,不然会引发错误,造成主程序异常退出。
