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?
解决方案 »
- blog上不了,报.text错误,把string与pchar的问题总结只好发到这里来共享,顺便送分.
- 在sql server中,怎样用sql语句做连接?
- File:的用法
- 关于RadioGroup自动保存上次设置的值:是BUG吗?怎样解决
- 简单问题给高分啊,越快越好
- treeview1中“+”号单击的事件是什么?
- 如何修改数据表中某一行某一列的值啊(datasource1+Table1)?
- 请问各位大虾?学Delpshi哪本书比较好!
- 请问!! int如何转换成byte?--------谢谢lastlove 0的帮助!!!!!!
- 怎样带子目录一起拷贝,有现成函数最好
- 图片存入数据库的问题
- 对数据进行批量操作
好像没有这个单元吧
使用的winsock版本是在WSAStartUp($202, WSData);这里控制的
好像没有这个单元吧 , 这个单元得加自己进去的, VS自带都用WINSOCK2@LocalAddr 前边得加指针类型转换 ,如果没记错是 PSockAddr
VC里都下边这么写
retVal = bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));
localAddrLen: integer;LocalAddr.sin_addr.S_addr:= INADDR_ANY;//服务端绑定的时候不用设置IP地址
localAddrLen := sizeof(LocalAddr);
Bind(ServerSocket, LocalAddr, localAddrLen);
这么搞一下bind是通过了,不过这怎么用啊?服务端不绑定IP地址,客户端怎么连上?大哥说下
绑定的是本机
客户商访问的时候就访问服务端的IP地址就行了
比如客户端和服务端都在一台机器上就可以在客户端用127.0.0.1访问
比如服务端的IP是局域网中的192.168.0.100,客户端访问期问的时候把把
ServerAddr.sin_addr.s_addr := inet_addr('192.168.0.100');
就可以了.
----------------当服务器有多个ip(如多块网卡)时,可以指明服务端绑定某个地址,
这样客户端只能以此指明的地址连接进来,否则一般就用INADDR_ANY,
客户端可以用多个地址任意一个链接。
或者说因为业务需要,一定要绑一个IP地址,那这时候怎么办?
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);
一般不会吧,用inaddr_any绑定的服务端
应该用任何能访问到他的IP都能连接上
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);服务端这么写就可以了,
listen(sockSrv, 5);这个转换成Delphi的代码怎么写?
#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();
DELPHI
bind(sockSrv, PSOCKADDR(@addrSrv), sizeof(SOCKADDR));
listen(sockSrv, 5);
找个教程好好的一步一步的看看
先把winsock的调通
再弄winsock2.pas这个的这个还是挺麻烦的,有的时候一个变量传的不对,编译能通过,但是运行的时候就会有问题
我记着有个地方要传sockaddr_in的长度,直接传sizeof(localaddr)就不行,能编译过,运行有问题
必须定义一个变量
localaddrlen := sizeof(localaddr)
再把localaddrlen传进去类似这样的问题
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),要声明个变量这个方法,我也试了下,也不行。。
按照这种写法也不行,winsock2怎么这么诡异的?就是不让绑定IP?
你说的那个,不能直接写Sizeof的是accpet函数