socket 求助.

satan_dongdong 2004-07-27 03:27:08
我在运行的时候只要一单击button1就会死机,请各位帮忙看看是怎么回事,哪里出错了?该怎么解决?

procedure TForm1.FormCreate(Sender: TObject);
var
WSAData:TWSAData;
begin
//init the version of the windows socket
if(WSAStartup(MAKEWORD(2,0),WSAData)<>0)then
showmessage('Error at WSAStartup().')
else
showmessage('WSAStartup() is success.');
//-------------------------------------------------------------
//create a socket--gameServerSocket
gameServerSocket:=socket(AF_INET,SOcK_STREAM,IPPROTO_TCP);
if gameServerSocket=INVALID_SOCKET then
begin
showmessage('Error at socket()'+IntToStr(WSAGetLastError()));
end;

//-------------------------------------------------------------
//bind the socket
serverAddr.sin_family:=AF_INET;
serverAddr.sin_addr.S_addr:=INADDR_ANY;//inet_addr('127.0.0.1');
serverAddr.sin_port:=4040;
bind(gameServerSocket,serverAddr,sizeof(serverAddr));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
//----------------------------------------------
//listen for the connection requests
listen(gameServerSocket,1);

//----------------------------------------------
//create a sockt for accept
StatusBar1.SimpleText:='Waiting for client to connect......';

//----------------------------------------------
//accept then connection
while true do
begin
acceptSocket:=SOCKET_ERROR;

while acceptSocket=SOCKET_ERROR do
begin
acceptSocket:=accept(gameServerSocket,nil,nil);
end;

StatusBar1.SimpleText:='Client connected.';
gameServerSocket:=acceptSocket;
break;
end;
end;

我在运行的时候只要一单击button1就会死机,请各位帮忙看看是怎么回事,哪里出错了?该怎么解决?
...全文
226 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
YiOnLine 2004-08-10
  • 打赏
  • 举报
回复
accept():接受某一Socket的连接要求,以完成 Stream Socket 的连接。

  格 式: SOCKET PASCAL FAR accept( SCOKET s,
                    struct sockaddr FAR *addr,
                    int FAR *addrlen );

  参 数: s     Socket的识别码
       addr    存放来连接的彼端的位址
       addrlen  addr的长度

  传回值: 成功 - 新的Socket识别码
       失败 - INVALID_SOCKET (呼叫 WSAGetLastError() 可得知原因)

  说明: Server 端之应用程式呼叫此一函式来接受 Client 端要求之
Socket 连接动作;如果Server 端之 Socket 是为 Blocking 模式,且没有人
要求连接动作,那麽此一函式会Block 函式马上回覆错误。accept() 函式的答
覆值为一新的 Socket,此 Socket 不可再用来接受其它的连接要求;但是原
先之 Socket 仍可接受其他人的连接要求。
satan_dongdong 2004-07-29
  • 打赏
  • 举报
回复
那请告诉我具体的问题是什么呢!?该怎么解决?谢谢!
flyinwuhan 2004-07-28
  • 打赏
  • 举报
回复
acceptSocket:=accept(gameServerSocket,nil,nil);---没有问题
while true do
这里有问题

satan_dongdong 2004-07-27
  • 打赏
  • 举报
回复
还是不行,而且还出现一个警告!
[Warning] UnitSocketServer.pas(139): Constant 0 converted to NIL
zhlwyy 2004-07-27
  • 打赏
  • 举报
回复
acceptSocket:=accept(gameServerSocket,0,nil);
satan_dongdong 2004-07-27
  • 打赏
  • 举报
回复
到这里停止,还不是很明白为什么会这样!
acceptSocket:=accept(gameServerSocket,0,0);
zhlwyy 2004-07-27
  • 打赏
  • 举报
回复
把它改为0 试试
satan_dongdong 2004-07-27
  • 打赏
  • 举报
回复
SOCKET accept(
SOCKET s,
struct sockaddr* addr,
int* addrlen
);

struct sockaddr* addr,---连接服务端客户端的地址吗?
zhlwyy 2004-07-27
  • 打赏
  • 举报
回复
accept的原型是什么
satan_dongdong 2004-07-27
  • 打赏
  • 举报
回复
正确的做法是什么呢!?谢谢!
zhlwyy 2004-07-27
  • 打赏
  • 举报
回复
所以你那两个NIL是代表返回空指针的意思
zhlwyy 2004-07-27
  • 打赏
  • 举报
回复
这段话的意思是说根据你给的地址,连接服务器信息,如果得到请求就返回信息,用一个指针变量做参数传递地址,但是必须这个SOCKET要被建立
satan_dongdong 2004-07-27
  • 打赏
  • 举报
回复
SOCKET accept(
SOCKET s,
struct sockaddr* addr,
int* addrlen
);

s
[in] Descriptor that identifies a socket that has been placed in a listening state with the listen function. The connection is actually made with the socket that is returned by accept.

addr
[out] Optional pointer to a buffer that receives the address of the connecting entity, as known to the communications layer. The exact format of the addr parameter is determined by the address family that was established when the socket from the sockaddr structure was created.

addrlen
[in, out] Optional pointer to an integer that contains the length of addr.


这是MSDN上的。不是很清楚!
satan_dongdong 2004-07-27
  • 打赏
  • 举报
回复
我想知道第二、第三个参数具体的是什么,第一个参数是肯定正确的!
zhlwyy 2004-07-27
  • 打赏
  • 举报
回复
gameServerSocket,nil,nil参数设置正确与否
ranma526 2004-07-27
  • 打赏
  • 举报
回复
到这个地方
acceptSocket:=accept(gameServerSocket,nil,nil);
就不能进行下去了,但是还是不知道怎么回事?
zhlwyy 2004-07-27
  • 打赏
  • 举报
回复
单步跟踪一下
zhlwyy 2004-07-27
  • 打赏
  • 举报
回复
while true do
这里有问题

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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