关于socket编程问题,100分急求

作者&投稿:羊钱 (若有异议请与网页底部的电邮联系)
解释一下C# socket编程。解释详细我给100分~

因为这里必须是一个 AsyncCallback 委托,这个是BeginReceive的构造参数。
public IAsyncResult BeginReceive (
byte[] buffer,
int offset,
int size,
SocketFlags socketFlags,
AsyncCallback callback,
Object state
)
参数:
buffer
Byte 类型的数组,它是存储接收到的数据的位置。
offset
buffer 参数中存储所接收数据的位置,该位置从零开始计数。
size
要接收的字节数。
socketFlags
SocketFlags 值的按位组合。
callback
一个 AsyncCallback 委托,它引用操作完成时要调用的方法。
state
一个用户定义对象,其中包含接收操作的相关信息。当操作完成时,此对象会被传递给 EndReceive 委托。

也就是new AsyncCallback(receivecallback)后又会执行receivecallback()这个方法。

o(∩_∩)o...哈哈100分拿来!!

最近也在学 还有一个自己写的C++聊天程序 有点大 下面是C写的
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字(SOCK_STREAM)。基于UDP采 用的数据报套接字(SOCK_DGRAM).
1.TCP流式套接字的编程步骤
在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK!
服务器端程序:
1、加载套接字库
2、创建套接字(socket)。
3、将套接字绑定到一个本地地址和端口上(bind)。
4、将套接字设为监听模式,准备接收客户请求(listen)。
5、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。
6、用返回的套接字和客户端进行通信(send/recv)。
7、返回,等待另一客户请求。
8、关闭套接字。
客户端程序:
1、加载套接字库
2、创建套接字(socket)。
3、向服务器发出连接请求(connect)。
4、和服务器端进行通信(send/recv)。
5、关闭套接字
服务器端代码如下:
#include //加裁头文件
#include //加载标准输入输出头文件

void main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}//加载套接字库,加裁失败则返回

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}//如果不是1.1的则退出
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建套接字(socket)。

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//转换Unsigned short为网络字节序的格式
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//将套接字绑定到一个本地地址和端口上(bind)
listen(sockSrv,5);//将套接字设为监听模式,准备接收客户请求(listen)。

SOCKADDR_IN addrClient;//定义地址族
int len=sizeof(SOCKADDR);//初始化这个参数,这个参数必须被初始化

while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//accept的第三个参数一定要有初始值。
//等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。
//此时程序在此发生阻塞
char sendBuf[100];
sprintf(sendBuf,"Welcome %s to http://www.sunxin.org",
inet_ntoa(addrClient.sin_addr));
//用返回的套接字和客户端进行通信(send/recv)。
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s
",recvBuf);
closesocket(sockConn);//关闭套接字。等待另一个用户请求
}
}
客户端代码如下:
#include
#include

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );加载套接字库
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);创建套接字(socket)。

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));向服务器发出连接请求(connect)。

char recvBuf[100];和服务器端进行通信(send/recv)。
recv(sockClient,recvBuf,100,0);
printf("%s
",recvBuf);
send(sockClient,"This is lisi",strlen("This is lisi")+1,0);

closesocket(sockClient);关闭套接字。
WSACleanup();//必须调用这个函数清除参数
}

1、首先若大量包裹是一起发的,完全不用操心这个问题,客户端发完包时会close链接,此时会发一个FIN信息表示已经发送完毕,这时服务器会自动收到FIN信息知道客户端完成发包完成了。而这些操作都是在socket api级别完成的,不用额外发一个EOF标志。
2、客户端包大于服务器缓冲区,这也不是你操心的,api级别会自动处理客户和服务器之间缓冲区的情况。若发包1000B而服务区缓冲区是250B,服务器收到250B造成缓冲区已满时,会通知客户端等下再发第二个250B(仅做个举例,这里面有个滑动窗口概念比较复杂。),所以客户收到等待通知时会隔上几个毫秒重发第二个250B就这样反复,直到服务器收到所有包为止。

所以说上面两个问题在编程时不需要考虑,但是需要编程人员理解里面的原理。另外我觉得题目中服务器记录所有包裹所用时间既是客户和服务器断开的时间。

假设是linux环境:
1. 你只要不断地调用read(socket, rev_buf, MAX_REV_BUF_SIZE-1), 并在while循环里检查read的返回值是不是为0,只要不是0,就把它rev_buf加到一个string中。所以不需要用EOF flag,只要client端不发送了,服务器端read的时候就会返回0.

2. 缓冲区只会对TCP/IP的协议栈的读取有影响,它的设置是为了协调应用层读取速度比网络层慢的问题,它对服务器的读取是透明的,所以不影响服务端的读取。只是对client端有影响,因为如果服务端没有及时从缓冲区中读取内容,client就会wait.

这个不懂 期待内行的同学回答


Python基础教程,第十五讲,网络编程(一)Socket详解
第一步:创建socket链接 第二步:使用bind()函数绑定ip地址和端口号 第三步:使用listen()函数设置允许排队等待连接的数量 第四步:接收信息,输出信息 接下来,我们编写客户端程序,创建连接后,使用connect()函数连接服务器。使用Python实现socket服务器非常简单,其他功能也是在此基础上实现的,如接受、...

什么是socket
Socket是一种网络编程接口。以下是关于Socket的详细解释:1. 基本定义:Socket可以被理解为一种网络通信的端点。它提供了一个通信的接口,允许不同的计算机之间进行数据传输。在大多数情况下,它可以用来建立客户端和服务器之间的连接,从而实现各种网络应用。2. 工作原理:在网络中,每一台计算机都有一个...

Socket编程重点函数详解
Socket编程中的核心函数详解如下:首先,select()函数是关键。它在文件描述符集合中监视事件,当满足条件(如数据到达)时返回。非阻塞模式下,它会在条件满足时立即返回,阻塞模式则需等待事件。struct timeval的timeout参数用于设置超时时间,0表示立即返回,大于0则设定等待时间。其次,accept()主要在服务...

C++里的Socket编程
connect()函数用于建立连接,返回值为-1表示错误,这时可以检查errno。listen()则用于设置监听队列,accept()则在有连接请求时接收并返回一个新的套接字。send()和recv()则用于数据的发送和接收,适用于流式或数据报套接字。尽管上述是Socket编程的基础,但C++的Socket API远不止这些,后续学习中还有更...

PHPSocket编程过程
Socket用于进程间通信,进程间通信通常基于客户端—服务端模型。此时,客户端—服务端是可以彼此交互的应用程序。客户端和服务端之间的交互需要连接。Socket编程负责的就是为应用程序之间建立可进行交互的连接。下面为大家介绍一下PHP Socket编程过程!使用代码 目的:开发一个客户端用于发送string消息到服务端,...

编程Linux下Socket编程指南linux下socket
\/\/ Linux Socket编程例子,这里是服务器端代码 include include include include include define MAX_LEN 1024 int main(int argc, char** argv){ \/\/1.建立socket int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd perror(“socket failed”);return -1;} \/\/2.准备通信...

socket接口对网络编程人员有何影响
Socket接口对网络编程人员的影响主要体现在以下几个方面:1. 编程便利性:Socket接口为网络编程人员提供了一种标准化的方式来进行网络通信。它简化了许多底层细节,如地址解析、数据封装、传输等,使得网络编程人员可以将更多的精力放在业务逻辑的实现上。2. 异步编程模型:Socket接口提供了一种异步的编程模型...

socket什么意思
Socket编程,作为底层网络编程的一种,直接操作Socket,赋予了开发者极大的灵活性和定制化能力。它深入网络通信的内部机制,让程序员能够根据特定的应用场景设计出独特的网络功能。在整个互联网技术的发展历程中,Socket起到了无可替代的角色,它提供了一种强大且灵活的网络通信解决方案,为我们的在线世界构建...

Socket编程
1.TCP流式套接字的编程步骤 在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK!服务器端程序:1、加载套接字库 2、创建套接字(socket)。3、将套接字绑定到一个本地地址和端口上(bind)。4、将套接字设为监听模式,准备接收客户请求(listen)。5、等待客户请求到来;当请求...

C语言socket编程之我的应用
socket编程的教材网上搜罗下还是很多的,思路基本上也是一样的,程序分两部分客户端和服务器端第一部分 服务器端一、创建服务器套接字(create)。二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。三、接受来自用户端的连接请求(accept)。四、开始数据传输(send\/receive)。五、关闭...

龙湖区19862336862: 关于socket编程问题,100分急求 -
壤终博可: 1、首先若大量包裹是一起发的,完全不用操心这个问题,客户端发完包时会close链接,此时会发一个FIN信息表示已经发送完毕,这时服务器会自动收到FIN信息知道客户端完成发包完成了.而这些操作都是在socket api级别完成的,不用额外...

龙湖区19862336862: 解释一下C# socket编程.解释详细我给100分 -
壤终博可: 因为这里必须是一个 AsyncCallback 委托,这个是BeginReceive的构造参数. public IAsyncResult BeginReceive ( byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, Object state ) 参数: buffer Byte 类型的数组,...

龙湖区19862336862: 关于SOCKET编程的一个问题
壤终博可: 看你编的是什么程序,要用到什么协议 如果是C、C++ Tcp协议 是用send发送 如果是用Udp的话是sendto. 如果用MFC的话还可以用WSAsend,他们都可以用来发送数据. 不懂他们的用法,可以去查下MSDN

龙湖区19862336862: socket编程好难啊,怎么学 -
壤终博可: 1. socket编程一般就是Socket和WinSock.都是C语言的.C++有封装好的类.用起来就更容易一些.2. 感觉关于C/C++的Socket编程不是很多,不过很多讲TCP/IP的都会讲Socket,就直接学TCP/IP编程的资料好了.3. 入门的程序挺多的,不过...

龙湖区19862336862: 关于vb.net中Socket的问题 -
壤终博可: 我不给你代码了,我才编了SOCKET的,告诉你原理吧(我的编程经验而已)SOCKET传输文件和接受是有大小限制的,默认是81**来则也就是8K多,你可以改小,但改大我没试过,然后你必须把文件分成...

龙湖区19862336862: 关于c语言socket编程多连接问题 -
壤终博可: 可以实现.socket就是一个int型的数字,拿到数字值,就意味着拿到socket句柄.逻辑上处理好,别弄的找不回来就行,每个程序可以使用的句柄数有限的,找不回来了的话,丢多了就没法得到新的了.放入epoll后还是按照正常的处理逻辑来处理.具体可以参考一些例子,自己写代码吧.没有给你最有用的答案,分数就不必给我了.

龙湖区19862336862: C++ socket编程的一个问题 SOCKET s = (SOCKET) nSockID; -
壤终博可: win32的socket实现中socketid表示socket操纵句柄,这货就是一个整数,SOCKET类型也是一个整数型.这句话的意义是将类型int强制转换成SOCKET型,以通过函数调用时的参数类型检验.这个整数的意义在网络编程中非常常见,叫做套接字描述符,和windows中的句柄是一个差不多的概念,所以在win32里套接字描述符也会被成为套接字句柄.通过socket函数返回,非零为成功创建,并以返回值作为此套接口的接口,以操作socket.

龙湖区19862336862: 请教关于Socket编程的问题
壤终博可: 全部procecdure:1.client->quest->server (也可不要这步)2.server->send ->client (一个分好的总包数)while 报数<总包数 client->quest->server(请求发包) server->send->client client->recevie->server 其实问题很简单就是你要定义包的含义.再根据含义send和receive就行了.我就是如许实现大大数据通信的.

龙湖区19862336862: socket编程中的接收数据丢失问题 -
壤终博可: TCP协议通信,接收方接收数据的前后次序与发送方一致,但数据包不一定一致.打个比方,发送方按顺序发送了2个数据包,接收可能仅接收1次就能全部收到,也可能需要收2次才能收到,也可能收3次,每次收到的数据大小不一定和发送方发...

龙湖区19862336862: 菜鸟socket编程 关于c++和c#的问题 -
壤终博可: 明确的告诉你,这个是可行的,socket是基于tcp/ip协议,无论是哪种语言写的服务器,只要开放socket端口,另外一种语言写的客户端是可以连接上的,它们之间使用标准的tcp/ip协议通讯.附:我曾经用c# 写服务器 然后flex(也就是flash的编程版)写客户端实现聊天系统,这个是可行的.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网