procedure TForm1.FormCreate(Sender: TObject);
var
  WSData: TWSAData;
  LocalAddr: TSockAddrIn;
  ServerSocket: TSocket;
begin
  //初始化Winsock
  WSAStartUp($202, WSData);
  //创建套接字
  ServerSocket:= Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  //设置LocalAddr的参数
  LocalAddr.sin_family:= AF_INET;   //IPV4族
  LocalAddr.sin_addr.S_addr:= Inet_addr('127.0.0.1');//点分字符串格式的IP地址转换为互联网格式
  LocalAddr.sin_port:= Htons(1777); //Host To Net Short,主机字节顺序转为网络字节顺序
  //绑定本机IP地址、端口,绑定之前先设置好LocalAddr的参数
  Bind(ServerSocket, LocalAddr, SizeOf(LocalAddr));
  Caption:= IntToStr(WSAGetLastError);
end;
就上面这几行代码,use winsock,就没问题,一切正常。
但是use winsock2,然后绑定的时候Bind(ServerSocket,@LocalAddr, SizeOf(LocalAddr)),因为winsock2这里和winsock不一样,这块要求的类型是个指针。就这几行代码,就是通不过,报10049错误,就是没办法绑定ip和port。1.ip和port都换过了,只要用winsock2,就是通不过,相同的ip、port,用winsock都能通过;
2.winsock.pas从网上找了两个,一个是JEDI Project的,一个不知道谁写的,两个都一样,编译上面的代码可以通过。就是绑定不了端口;
很火很郁闷。。难道要自己用dll?

解决方案 »

  1.   

    use winsock2
    好像没有这个单元吧
    使用的winsock版本是在WSAStartUp($202, WSData);这里控制的
      

  2.   

    2.winsock.pas从网上找了两个,一个是JEDI Project的,一个不知道谁写的,两个都一样,编译上面的代码可以通过。就是绑定不了端口; 是winsock2.pas,写错了。
      

  3.   

    use winsock2 
    好像没有这个单元吧 , 这个单元得加自己进去的, VS自带都用WINSOCK2@LocalAddr 前边得加指针类型转换 ,如果没记错是 PSockAddr
    VC里都下边这么写
    retVal = bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN)); 
      

  4.   

    var
      localAddrLen: integer;LocalAddr.sin_addr.S_addr:= INADDR_ANY;//服务端绑定的时候不用设置IP地址
    localAddrLen := sizeof(LocalAddr);
    Bind(ServerSocket, LocalAddr, localAddrLen);
      

  5.   

    1.delphi是没有winsock2的,我是从网上下的,一共下了两个版本,一个是jedi的,一个不知道是谁写的。我觉得我已经写的很清楚了哇~~~~~~~~~2.LocalAddr.sin_addr.S_addr:= INADDR_ANY;//服务端绑定的时候不用设置IP地址 
    这么搞一下bind是通过了,不过这怎么用啊?服务端不绑定IP地址,客户端怎么连上?大哥说下
      

  6.   

    服务端绑定的时候当然是不用指定IP地址了
    绑定的是本机
    客户商访问的时候就访问服务端的IP地址就行了
    比如客户端和服务端都在一台机器上就可以在客户端用127.0.0.1访问
    比如服务端的IP是局域网中的192.168.0.100,客户端访问期问的时候把把
    ServerAddr.sin_addr.s_addr := inet_addr('192.168.0.100');
    就可以了.
      

  7.   

    服务端不绑定IP地址,客户端怎么连上?
    ----------------当服务器有多个ip(如多块网卡)时,可以指明服务端绑定某个地址,
    这样客户端只能以此指明的地址连接进来,否则一般就用INADDR_ANY,
    客户端可以用多个地址任意一个链接。
      

  8.   

    原来是这样呃。多谢两位楼上的。但是我就是想知道为什么?因为同样的代码,在用winsock的时候是没问题的呃,为什么winsock2就不行了?
    或者说因为业务需要,一定要绑一个IP地址,那这时候怎么办?
      

  9.   

    给你写了发送的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));
    char SentStr[255] = "Test";
    int SendLen = send(sockClient, (char *)SentStr, strlen(SentStr)+1, 0);
      

  10.   

    不知道那个winsock2是什么样子的
    一般不会吧,用inaddr_any绑定的服务端
    应该用任何能访问到他的IP都能连接上
      

  11.   

    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(6000); bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
            listen(sockSrv, 5);服务端这么写就可以了,
      

  12.   

    winsock2太长了,贴不上来。在Google里 winsock2.pas 搜一下到处都有的下。现在问题不是连接不上,而是Bind函数根本不让你绑定一个固定的IP,这个怎么这么奇怪了?费解啊。。
      

  13.   

    这C的代码吧??bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
            listen(sockSrv, 5);这个转换成Delphi的代码怎么写?
      

  14.   

    不是都和你说了吗,服务器端代码如下:
    #include <stdio.h>
    #include <Winsock2.h>
    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 sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv;
     addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
     addrSrv.sin_family=AF_INET;
     addrSrv.sin_port=htons(6000);
     
     bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); listen(sockSrv,5); SOCKADDR_IN addrClient;
     int len=sizeof(SOCKADDR);
     while(1)
     {
      SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
      char sendBuf[50];
      sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));
      send(sockConn,sendBuf,strlen(sendBuf)+1,0);
      char recvBuf[50];
      recv(sockConn,recvBuf,50,0);
      printf("%s\n",recvBuf);
      closesocket(sockConn);
     }}
    客户端#include <stdio.h>
    #include <Winsock2.h>
    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);
     
     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));
     send(sockClient,"hello",strlen("hello")+1,0);
     char recvBuf[50];
     recv(sockClient,recvBuf,50,0);
     printf("%s\n",recvBuf);
     
     closesocket(sockClient);
     WSACleanup();
      

  15.   


    DELPHI
    bind(sockSrv, PSOCKADDR(@addrSrv), sizeof(SOCKADDR));
            listen(sockSrv, 5);
      

  16.   

    他还没到那一步呢
    找个教程好好的一步一步的看看
    先把winsock的调通
    再弄winsock2.pas这个的这个还是挺麻烦的,有的时候一个变量传的不对,编译能通过,但是运行的时候就会有问题
    我记着有个地方要传sockaddr_in的长度,直接传sizeof(localaddr)就不行,能编译过,运行有问题
    必须定义一个变量
    localaddrlen := sizeof(localaddr)
    再把localaddrlen传进去类似这样的问题
      

  17.   


    1.就是教程上的代码。
    2.发送接收什么的我都做了,没贴代码而已,因为我找到原因,就是bind这一步出错。winsock已经调试了,没有问题,可以正常绑定。winsock2就是不行。
    3.LocalAddr.sin_addr.S_addr:= Inet_addr('127.0.0.1');这么写,在winsock2下面就是不能绑定,换成LocalAddr.sin_addr.S_addr:= INADDR_ANY; 程序调试通过,完全正常,发送接收什么的都没问题。
    我现在就是想知道3是什么情况?为啥不绑IP地址,程序就没问题,绑了IP地址,编译可以通过,但其实用WSAGetLastError可以看到10049错误,说明根本就没绑定成功。还有你说不能直接写SizeOf(LocalAddr),要声明个变量这个方法,我也试了下,也不行。。
      

  18.   

    你发的那一堆代码,在winsock下面,我类似的代码已经调试了,没问题,都通过了。就是在winsock2下面,到bind这一步就有问题了,怎么都不能绑定IP,只能写LocalAddr.sin_addr.S_addr:= INADDR_ANY,只要这么写程序也是没有任何问题的。我想问的就是为啥会这样?为啥LocalAddr.sin_addr.S_addr:= Inet_addr('127.0.0.1');这样就不能绑定?bind(sockSrv, PSOCKADDR(@addrSrv), sizeof(SOCKADDR));
    按照这种写法也不行,winsock2怎么这么诡异的?就是不让绑定IP?
      

  19.   

    to winter:
    你说的那个,不能直接写Sizeof的是accpet函数