调用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楼主是定义在栈中的,这下子一接收就溢出,堆栈里的其它东西被破坏.