‘壹’ 知道什么是WSABUF结构的请进。。。(Win Socket编程)
你想多了 buf.buf = pPerIO->buf; 意思是说把pPerIO->buf这个数据缓冲区的首指针赋给buf.buf
因为buf.buf 本身是个指针,它没有分配空间
‘贰’ windows socket编程后怎样使用
mfc只是对socket进行了一些封装,大部分人做网络编程都是用的原始的socket,比如如下接口都可以在c下进行调用
1.socket()
2.bind()
3.connect()
4.listen()
5.accept()
6.send() 和recv()
7.sendto() 和recvfrom()
8.close() 和shutdown()
9.getpeername()
10.gethostname()
这些接口是在Winsock2.h中定义的不是在mfc中定义的,你只需要包含Winsock2.h头文件和Ws2_32.lib库就可以了。
‘叁’ 求winsocket编程的最简例子,C++的
#include <winsock2.h>#pragma comment(lib,"WS2_32.lib")class CSockInit
{
public:
CSockInit(BYTE minorVer=2,BYTE majorVer=2)
{
WSADATA wsaData;
WORD sockVersion=MAKEWORD(minorVer,majorVer);
if(::WSAStartup(sockVersion,&wsaData)!=0)
{
exit(0);
}
}
~CSockInit()
{
::WSACleanup();
}
};//先定义个类原来初始化WinSocket //下面是服务器端的的程序#include <stdio.h>
#include "CInitSock.h"CSockInit sockInit;
int main()
{
SOCKET sock=::socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(sock==INVALID_SOCKET)
{
printf("Failed socket\n");
return 0;
}
sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(4567);
sin.sin_addr.S_un.S_addr=INADDR_ANY;
if(::bind(sock,(sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR)
{
printf("Failed bind\n");
return 0;
}
char buf[1024]={0};
sockaddr_in addr;
int nlen=sizeof(addr);
while (1)
{
int nRecv=recvfrom(sock,buf,1024,0,(sockaddr*)&addr,&nlen);
if(nRecv>0)
{
buf[nRecv]='\0';
printf("接收数据(%s):%s\n",::inet_ntoa(addr.sin_addr),buf);
}
}
::closesocket(sock);
} //下面是客服端的程序。 #include <stdio.h>
#include "..\CInitSock.h"
CSockInit sockin;
void main()
{
SOCKET s=::socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(s==INVALID_SOCKET)
{
printf("Failed socket()\n");
return ;
}
sockaddr_in addr;
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addr.sin_family=AF_INET;
addr.sin_port=htons(4567);
char zstext[]="TCP server Demo!\r\n";
while (1)
{
::sendto(s,zstext,strlen(zstext),0,(sockaddr*)&addr,sizeof(addr));
scanf("%s",zstext);
}
} 这个是基于UDP/IP的。水平有点差,莫见怪,在win32平台上,Visual studio 上基本上都能运行,不用链接静态库的,只要你包含了第一个封装好了的头文件就可以了。