- 论坛徽章:
- 0
|
本帖最后由 青乡之b 于 2011-06-14 11:43 编辑
//initsock.h
//初始化winsock2库
#include<winsock2.h>
#pragma comment(lib,"WS2_32")
class CInitSock
{
public:
CInitSock(BYTE minorVer=2,BYTE majorVer=2){
WSADATA wsaData;
WORD sockVersion=MAKEWORD(minorVer,majorVer);
if(WSAStartup(sockVersion,&wsaData)!=0){
exit(0);
}
}
~CInitSock(){
WSACleanup();
}
};
---------------------------------------------------------------------------------------------------------------------
以下创建两个项目UDPServer.cpp和UDPClient.cpp
//UDPServer.cpp
#include "stdafx.h"
#include"initsock.h"
#include<stdio.h>
CInitSock initsock;//初始化winsock2库
int _tmain(int argc, _TCHAR* argv[])
{
//创建套接字
SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(s==INVALID_SOCKET){
printf("Failed socket\n");
return 0;
}
//填充IP地址
sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(4567);
sin.sin_addr.S_un.S_addr=INADDR_ANY;
//绑定套接字到本地地址
if(bind(s,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR){
printf("Failed bind()\n");
return 0;
}
//接收数据
char buff[1024];
sockaddr_in addr;
int nLen=sizeof(addr);
while(TRUE){
int nRecv=recvfrom(s,buff,1024,0,(sockaddr *)&addr,&nLen);
if(nRecv>0){
buff[nRecv]='\0';
printf("接收到数据(%s):%s",inet_ntoa(addr.sin_addr),buff);
}
}
closesocket(s);
return 0;
}
//UDPClient.cpp
#include "stdafx.h"
#include"initsock.h"
#include<stdio.h>
CInitSock initsock;//初始化winsock2库
int _tmain(int argc, _TCHAR* argv[])
{
//创建套接字
SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(s==INVALID_SOCKET){
printf("Failed socket()\n");
return 0;
}
//填充远程地址
sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(4567);
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
//发送数据
char szText[]="TCP server demo!\n";
sendto(s,szText,strlen(szText),0,(sockaddr *)&addr,sizeof(addr));
return 0;
}
问题:
1 SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); —— SOKCET是套接字?socket()返回套接字句柄?套接字和套接字句柄是一回事吗?
2 addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");——127.0.0.1回环地址到底该如何理解?
3 int nRecv=recvfrom(s,buff,1024,0,(sockaddr *)&addr,&nLen);——recvfrom()与recv()区别?分别用在什么地方?
4 运行时, 一会儿出现 Failed bind(),一会儿什么结果都没有,为什么? |
|