send();

s81611541 2008-12-27 01:16:36
send(),为什么在服务端向客户端发送数据的时候客户端只收的到第一次的数据,,后面的全为空啊!!在所有过程中都没有错误码返回啊!!只有服务端在发送数据第五次的时候就会出现错误代码!!10035:error = "Operation would block";
请教各位高手!!!
...全文
160 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
laohu6599 2009-01-16
  • 打赏
  • 举报
回复
顶6楼
gengzhiwei 2009-01-14
  • 打赏
  • 举报
回复
出现这样的情况是,你的服务器端是非阻塞模式的,发送过快或者包比较大的时候,会出现阻塞的错误,解决这个问题可以用下面方法:

1、如果还是要非阻塞模式的情况,只有做一定延时,再发送,直到发送成功才返回;

2、切换到非阻塞的模式,这样就会发送等待,包直到发送出去才返回;
sun007700 2009-01-05
  • 打赏
  • 举报
回复
顶6楼~~
Derekfan 2008-12-29
  • 打赏
  • 举报
回复
為了保證能夠接收到完整的信息,最好在接收函數recv()函數前添加一個sleep()函數。不然經常會無法接收到完整的信息。
路人乙2019 2008-12-29
  • 打赏
  • 举报
回复
最好判断是否全发出去了,没有的话在循环中再发,否则跳出循环。
yize.link 2008-12-27
  • 打赏
  • 举报
回复
一般如果是这样的话.

是不是你服务器忘记阻塞了.

或者是你收到一条信息后就关闭了socket!

或者你方式根本不对
CodeProject-Jerry 2008-12-27
  • 打赏
  • 举报
回复
把你的发送方法改改
记得检查返回值,确保所有的缓存区全部发送出去了

int nSent = 0;
int nBufferSize = 你的缓存区大小;
LPBYTE lpBase = 你的缓存区首指针

while( nSent < nBufferSize )
{
int nRet = ::send( SOCKET, (LPBYTE)(lpBase +nSent), nBufferSize - nSent, 0);

if( nRet == SOCKET_ERROR )
{
if( WSAGetLastError() == WSAEWOULDBLOCK )
continue;
else break;
}
nSent += nRet;
}



大概是这样
s81611541 2008-12-27
  • 打赏
  • 举报
回复
server::
Form1: TForm1;
buffer:array[1..10000] of Char;
s,s1,ac:Tsocket;
p:^Psockaddr;
namelen1:^pinteger;
wv:WORD;
ws:TWSADATA;
data:char;

implementation



{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
err:integer;
HV,LV:integer;
ntype,protocol:integer;
name,name1:TSockAddr;// sockaddr_in三部分组成:主机地址,协议号(显式设置为UDP和TCP)和用以区分应用的端口号
namelen,len:integer;
backlog:integer;
port:integer;
begin
port:=5000;
backlog:=10;
wv := MAKEWORD(2,1);
err:= WSAStartup(wv,ws);
edit1.Text:=inttostr(err);
HV:=WS.wHighVersion;
LV:=WS.wVersion;
EDIT2.Text:=INTTOSTR(lo(ws.wVersion));
EDIT3.TEXT:=INTTOSTR(hi(ws.wVersion));
if ((lo(ws.wVersion)<=1) and (hi(ws.wVersion)<1)) then
begin
wsacleanup();
showmessage('winsock.dll装载失败');
end
else
begin
//....................................//
protocol:=0;
ntype:=SOCK_STREAM; {SOCK_STREAM 提供有序的、可靠的、双向的和基于连接的字节流,使用带外数据传送机制,为Internet地址族使用TCP。
SOCK_DGRAM 支持无连接的、不可靠的和使用固定大小(通常很小)缓冲区的数据报服务,为Internet地址族使用UDP。}
s:=Socket(AF_INET,ntype,protocol);
edit4.text:=inttostr(s);
// edit3.text:=inttostr(ntype);
//...........//
name.sin_family:=AF_INET ;
name.sin_port:=htons(port);
name.sin_addr.S_addr:=inet_addr('10.10.9.8');
len:= sizeof(name);
s1:= bind(s,name,len);
edit5.text:=inttostr(s1);//getsockname()
edit6.text:=inttostr(listen(s,backlog));
p:=@name;
namelen1:=@len;
// SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR* addr,int FAR* addrlen);
//nt PASCAL FAR WSAAsyncSelect ( SOCKET s, HWND hWnd,unsigned int wMsg, long lEvent );
end;



end;

procedure TForm1.Button2Click(Sender: TObject);
var
irecv:integer;
begin
irecv:=recv(ac,buffer,sizeof(buffer),0);
edit7.text:=inttostr(WSAGetLastError());
edit9.text:=inttostr(irecv);
EDIT10.TEXT:=BUFFER;


end;

procedure TForm1.Button3Click(Sender: TObject);
begin
wsaasyncselect(s,Form1.WindowHandle,2,FD_ACCEPT);
ac:=accept(s,@p,@namelen1);
edit8.Text:=inttostr(ac);

end;

procedure TForm1.Button4Click(Sender: TObject);
var
bu:string[255];
i:integer;
sen:integer;
begin
i:=0;
bu:=edit11.Text;
while i<=255 do
begin
buffer[i]:=bu[i];
i:=i+1;
end;
sen:=send(ac,buffer,sizeof(buffer),MSG_DONTROUTE);
edit12.Text :=inttostr(WSAGetLastError())
s81611541 2008-12-27
  • 打赏
  • 举报
回复
Form1: TForm1;
buffer,buffer1:array[0..1000] of char;
sen,con,s:Tsocket;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var

addr:Tsockaddr;
type1,p:integer;
ws:Twsadata;
wv:word;


begin
wv := MAKEWORD(2,1);
WSAStartup(wv,ws);
s:=socket(AF_INET,SOCK_STREAM,0);
edit1.text:=inttostr(s);
addr.sin_family:=AF_INET ;
addr.sin_port:=htons(5000);
addr.sin_addr.S_addr:=inet_addr('10.10.9.8');
con:=connect(s,addr,sizeof(addr));
edit5.Text :=inttostr(WSAGetLastError());
edit2.Text:=inttostr(con);
end;

procedure TForm1.Button2Click(Sender: TObject);

var
bu:string[255];
i:integer;

begin
i:=0;
bu:=edit4.Text;
while i<=255 do
begin
buffer[i]:=bu[i];
i:=i+1;
end;
sen:=send(s,buffer,sizeof(buffer),MSG_DONTROUTE);
edit6.Text:=inttostr(WSAGetLastError());
edit3.text:=inttostr(sen);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
irecv:integer;
begin
irecv:=recv(s,buffer1,sizeof(buffer1),0);
edit8.Text:=inttostr(WSAGetLastError());
EDIT7.TEXT:=BUFFER1;
edit9.Text:=inttostr(irecv);
s81611541 2008-12-27
  • 打赏
  • 举报
回复
第一次发送的数据!!我第二次也发送那些数据啊!!!一般要发送好多数据啊!!我接收端的RECV()的返回值是我接收缓存区的大小!!
Learn-anything 2008-12-27
  • 打赏
  • 举报
回复
代码
cnzdgs 2008-12-27
  • 打赏
  • 举报
回复
发送多少数据,各次recv的返回值是多少?相关代码。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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