首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

调用winsock api出现access violation 异常

2012-03-23 
调用winsock api出现access violation 错误客户端:varsvrAddr:TSockAddrInsid:Integersbuff:array[0..11

调用winsock api出现access violation 错误
客户端:
var
    svrAddr   :TSockAddrIn;
    sid   :Integer;
    sbuff   :array[0..11]   of   char;
    cc   :PChar;
    wsaData   :TWSAData;
begin
    WSAStartup($0002,   wsaData);
    sid   :=   socket(AF_INET,     SOCK_STREAM,   0);
    svrAddr.sin_family   :=   AF_INET;
    svrAddr.sin_addr.S_addr   :=   inet_addr( '127.0.0.1 ');
    svrAddr.sin_port   :=   htons(2577);

    if   connect(sid,   svrAddr,   sizeof(svrAddr))   =   SOCKET_ERROR   then
    begin
        showMessage( 'Can ' 't   connect ');
        exit;
    end;
    recv(sid,   sbuff,   1024,   0);
    Edit1.Text   :=   sBuff;
    shutdown(sid,   2);
    closesocket(sid);


end;

服务端:
var
    Sid,   SidNew   :integer;
//     svrAddr   :PsvrAddr;
    svrAddr   :TSockAddrIn;
    Plen   :Pint;
    len   :Integer;
    sbuff   :array[0..11]   of   char;
begin
    svrAddr.sin_family   :=   AF_INET;
    svrAddr.sin_addr.S_addr   :=   inet_addr( '127.0.0.1 ');
    svrAddr.sin_port   :=   htons(2577);

    Sid   :=   socket(AF_INET,   SOCK_STREAM,   0);
    if     bind(Sid,   svrAddr,   sizeof(svrAddr))   <   0   then
    begin
        ShowMessage( 'Error   In   Server   Bind ');
        exit;
    end;

    if   listen(Sid,   1)   <   0   then
    begin
        Showmessage( 'Error   in   Socket   Listen ');
        exit;
    end;

    len   :=   sizeof(svrAddr);
    SidNew   :=   accept(Sid,   @svraddr,   @len);
    if   SidNew   <   0   then
    begin
        ShowMessage( 'Error   In   Server   Accept ');
        exit;
    end;

    shutdown(sid,   2);
    closesocket(sid);
    sbuff   :=   ‘aaa’;
    send(SidNew,   sbuff,   1024,   0);
    shutdown(Sidnew,   2);
    closesocket(sidNew);
   
end;

客户端在读取数据完后出现存取违规错误,   通过断点调试,已成功从服务端获取数据。

[解决办法]
看楼主代码,当客户端连接上服务端后,服务端即向客户端发1024字节的数据.

看楼主客户端接收缓冲只用了十二个字节.
.......
sbuff :array[0..11] of char; 
......
而接收时却...
recv(sid, sbuff, 1024, 0); 

sbuff楼主是定义在栈中的,这下子一接收就溢出,堆栈里的其它东西被破坏.



热点排行