通常每个套接字地址(协议/网络地址/端口)只允许使用一次

anya 2008-11-21 04:24:27

使用socket从客户端传递截屏下来的图片到服务器端.出现错误提示:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。帖出代码,大家帮忙看下是哪里出了问题.


下面是代码:
客户端截屏并且socket传递到服务器端:(C/S)

using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Drawing.Imaging;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace Example023_屏幕捕获程序
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest, //目标设备的句柄
int nXDest, // 目标对象的左上角的X坐标
int nYDest, // 目标对象的左上角的X坐标
int nWidth, // 目标对象的矩形的宽度
int nHeight, // 目标对象的矩形的长度
IntPtr hdcSrc, // 源设备的句柄
int nXSrc, // 源对象的左上角的X坐标
int nYSrc, // 源对象的左上角的X坐标
System.Int32 dwRop // 光栅的操作值
);

[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern IntPtr CreateDC(
string lpszDriver, // 驱动名称
string lpszDevice, // 设备名称
string lpszOutput, // 无用,可以设定位"NULL"
IntPtr lpInitData // 任意的打印机数据
);


private void button1_Click(object sender, EventArgs e)
{
this.Hide();
IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
//创建显示器的DC
Graphics g1 = Graphics.FromHdc(dc1);
//由一个指定设备的句柄创建一个新的Graphics对象
Bitmap MyImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
//根据屏幕大小创建一个与之相同大小的Bitmap对象
Graphics g2 = Graphics.FromImage(MyImage);
//获得屏幕的句柄
IntPtr dc3 = g1.GetHdc();
//获得位图的句柄
IntPtr dc2 = g2.GetHdc();
//把当前屏幕捕获到位图对象中
BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376);
//把当前屏幕拷贝到位图中
g1.ReleaseHdc(dc3);
//释放屏幕句柄
g2.ReleaseHdc(dc2);
//释放位图句柄
MyImage.Save("d:\\MyJpeg.jpg", ImageFormat.Jpeg); //当然你也可以根据自己的需要,把屏幕以其他图片的格式来保存,如果你想把图片保存为位图文件,可以把"ImageFormat.Jpeg"改换成"ImageFormat.Bmp";想把图片保存为Gif文件,就把"ImageFormat.Jpeg"改换成"ImageFormat.Gif"。你可以保存的文件类型大概有十多种,这里就不一一介绍了,当然你也要相应改变保存文件的后缀。
pictureBox1.Image = MyImage;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; //本程序所用控件为1个按狃,一个panel,一个picturebox,其中panel的属性Autoscroll =true; picturebox的属性SizeMode =AutoSize; 然后只要改变pictureBox的大小,图象就会跟着改变大小,如果把这句去掉的话,就可以实现图象按panel滚动条移动而查看全图。

// MessageBox.Show("已经把当前屏幕保存到D:\\MyJpeg.jpg文件中!");
this.Show();


//***************************************************************************************开始使用socket发送文件*********************************************************//
System.Net.Sockets.Socket sendsocket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
//实例化socket
System.Net.IPEndPoint ipendpiont = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("192.168.1.1"), 8080); //服务器的IP和端口//因为客户端只是用来向特定的服务器发送信息,所以不需要绑定本机的IP和端口。不需要监听。
//建立终结点
System.IO.MemoryStream Stream = new System.IO.MemoryStream();
pictureBox1.Image.Save(Stream, System.Drawing.Imaging.ImageFormat.Bmp);//存储为bmp图象
// pictureBox1.Image.Save(Stream, System.Drawing.Imaging.ImageFormat.Jpeg); //不想存储为bmp图象,想存储为jpeg图象
byte[] b = Stream.ToArray();

sendsocket.Connect(ipendpiont);
//连接远程计算机
sendsocket.Send(b);
//发送

Stream.Close();
sendsocket.Shutdown(System.Net.Sockets.SocketShutdown.Send);
//关闭发送连接
sendsocket.Close(); //关闭本

}

}
}


服务器端接收图片并显示:(B/S)
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;

public partial class Receive : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{

}
}
protected void Button1_Click(object sender, EventArgs e)
{
//如何确定该数组大小
System.IO.MemoryStream fs = new System.IO.MemoryStream();
System.Net.Sockets.Socket receivesocket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
System.Net.IPEndPoint hostipendpiont = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("192.168.1.1"), 8080); //服务器端IP和端口号
receivesocket.Bind(hostipendpiont);
//建立远程计算机的的socket
receivesocket.Listen(2);
//设置接收数据缓冲区的大小
byte[] b = new byte[1765107];
//监听socket
System.Net.Sockets.Socket hostsocket = receivesocket.Accept(); //同意和发送端计算机建立连接
hostsocket.Receive(b);
fs.Write(b, 0, b.Length);
Bitmap Img = new Bitmap(fs);
//PictureBox1.Image = Img;
Img.Save("e:\\MyJpeg.jpg", ImageFormat.Jpeg);
this.Image1.ImageUrl = @"e:\MyJpeg.jpg";
fs.Close();
hostsocket.Shutdown(System.Net.Sockets.SocketShutdown.Receive);
hostsocket.Close();
}
}
...全文
12167 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckz0409 2012-10-12
  • 打赏
  • 举报
回复
这个问题很简单的,一般选择端口号五万以上的就没有问题了![Quote=引用 28 楼 的回复:]
引用 26 楼 的回复:

同样遇到这个问题了,求助啊


这位大侠 你的问题解决了没?分享一下
[/Quote]
落日赌城 2012-08-30
  • 打赏
  • 举报
回复
同一台机器,同一个IP,同一个端口
大模型炼丹师 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 的回复:]

同样遇到这个问题了,求助啊
[/Quote]

这位大侠 你的问题解决了没?分享一下
大模型炼丹师 2012-08-15
  • 打赏
  • 举报
回复
楼主 怎么解决的 分享一下吧
qing_qing_miao 2012-06-29
  • 打赏
  • 举报
回复
同样遇到这个问题了,求助啊
coolkenney 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]

未解决问题之前苦求别人帮忙,。。。哦,现在自己解决问题就一走了之,生怕共享,生怕别人知道,此人心胸可见。。。。。。。
[/Quote]


╭︿︿︿╮
{/ o o /}
( (oo) )
︶ ︶︶木有jj
baichangle 2012-02-02
  • 打赏
  • 举报
回复
留个脚印~
trilcc 2011-08-17
  • 打赏
  • 举报
回复
正好在学这方面的
qs1208 2011-08-09
  • 打赏
  • 举报
回复
我也碰到了这个问题,发现我进程里面没有关掉我这个程序。
是关不掉。
我在网上找到了解决方法。


贴出来给大家看看:

C#:程序关闭了,为什么在后台还有进程存在?
以前也看到有朋友存在这个问题,当时没有在意。现在自己的项目中也遇到这种情况,略作研究,给大家分享一下。

最终发现我的项目里面出现这种情况的原因是线程的创建和终结问题。

解决办法有两种:

A:在建立线程的时候指定这个线程是后台线程(.IsBackground属性为true).那么主线程关闭的时候它也会关闭.

B:如果线程不是设置为后台线程,需要手动关闭,但是也有可能是abort不干净或者线程在等待什么的时候是不会关闭的.
aniywn219 2011-06-09
  • 打赏
  • 举报
回复
未解决问题之前苦求别人帮忙,。。。哦,现在自己解决问题就一走了之,生怕共享,生怕别人知道,此人心胸可见。。。。。。。
e861119 2011-05-13
  • 打赏
  • 举报
回复
怎么解决的啊,分享下 啊
maoli448 2010-11-18
  • 打赏
  • 举报
回复
为什么我在运行socket.Accept()的时候,执行不下去了!
wl_851110 2010-11-05
  • 打赏
  • 举报
回复
楼主木有jj。。
xinyuetonghua 2010-10-26
  • 打赏
  • 举报
回复
怎么解决的啊,分享下 啊
ding5818360 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xiangjing163 的回复:]
好贴 感谢!!!
[/Quote]hao
leochen315531813 2010-10-11
  • 打赏
  • 举报
回复
我也遇到同样的问题了,汗。。
hetan3011 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 anya 的回复:]
多谢各位,问题解决
[/Quote]
LZ,问题解决了 把解决方法和大家共享一下啊
Edwin380019813 2010-06-17
  • 打赏
  • 举报
回复
怎么解决啊???求答案!
duanwenbo 2010-06-13
  • 打赏
  • 举报
回复
通常每个套接字地址(协议/网络地址/端口)只允许使用一次
  • 打赏
  • 举报
回复
好贴 感谢!!!
加载更多回复(10)

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧