VC环境下UDP Socket编程 depend vc2010

来源:互联网 发布:软件测试性能指标 编辑:程序博客网 时间:2024/05/23 11:50

//本帖抄自网上,经过调试成功,自己留着备用。与大家互相学习。

//在vc2010上能编译通过。能互相通信。

//server 和 client 都要"项目属性"--->"配置属性"----> "链接"----> "输入" --->"附加依赖项"中添加"ws2_32.lib"

//UDP client  

//client send string to server  
#include <stdio.h>  
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")   //必须加载一个库
#define BUFLEN 1024 

void ClientUdp(void)

{

SOCKET client;  //SOCKET 是大写的

SOCKADDR_IN addr;  //跟linux的不同是,全部变量都得在前面这里先定义了,后面再使用,否则出错。
char buf[BUFLEN];  
WSADATA wsa;

int error;

eror=WSAStartup(MAKEWORD(1,1),&wsa); //initial Ws2_32.dll by a process  //加载库,UDP的首要步骤 

//---------------------------------------------------------------------------------------------------------------------------

if(error!=0)//这部分非必须
{
printf("WSAStartup error=%d\n",error);
}
 if(LOBYTE(wsa.wVersion)!=1 || HIBYTE(wsa.wVersion)!=1)
{
printf("版本出错\n");
printf("wVersion=%dwsa.wVersion=%d",wsa.wVersion,wsa.wVersion);

}

//---------------------------------------------------------------------------------------------------------------------------

if((client = socket(AF_INET,SOCK_DGRAM,0)) <= 0)  //返回一个套接字

{  
        printf("Create socket fail!\n");  
        return -1;  
}  

//---------------------------------------------------------------------------------------------------------------------------

memset(&addr, 0, sizeof(addr)); 

addr.sin_family = AF_INET;  

addr.sin_addr.s_addr = inet_addr("192.168.56.1");//inet_addr("127.0.0.1");   //这里填写要发送到服务端的ip.一般没问题,127是本地回环,没试试成功。
addr.sin_port = htons(5555);  
bind(client,(struct sockaddr *)&addr,sizeof(addr));  
      
while(1)

printf("pls input:");
scanf("%s", buf);
sendto(client, buf,strlen(buf)+1, 0, (SOCKADDR *)&addr, sizeof(addr));
memset(buf,0,sizeof(buf));
}  
  
closesocket(client);
WSACleanup();   //clean up Ws2_32.dll  
}


int main(void)  
{  
ClientUdp();
return 0;  

}  

//------------------------------------------------------------------------------------------------------------------------

//UDP server  
//listen port 9102  
//receive string and display it 
#include <stdio.h>  
#include <winsock2.h>  
#pragma comment(lib,"ws2_32.lib")   
#define BUFLEN 1024
 
void ServerUdp(void)
{
SOCKET server;  

SOCKADDR_IN addr;  
char buf[BUFLEN];  
int len;  
WSADATA wsa;//全部在这里定义了,后面才使用。在下面定义的话会出错。
int error;

error=WSAStartup(MAKEWORD(1,1),&wsa); //initial Ws2_32.dll by a process  

//---------------------------------------------------------------------------------------------------------------------------- 
 if(error!=0)//非必须
{
printf("WSAStartup error=%d\n",error);
}
 if(LOBYTE(wsa.wVersion)!=1 || HIBYTE(wsa.wVersion)!=1)
{
printf("版本出错\n");
printf("wVersion=%dwsa.wVersion=%d",wsa.wVersion,wsa.wVersion);
}

//----------------------------------------------------------------------------------------------------------------------------

if((server = socket(AF_INET,SOCK_DGRAM,0)) <= 0)  //创建SOCK

{  
        printf("Create socket fail!\n");  
        return -1;  
}
//---------------------------------------------------------------------------------------------------------------------------
memset(&addr, 0, sizeof(addr));  
addr.sin_family = AF_INET;  
addr.sin_port = htons(5555);  
addr.sin_addr.s_addr = inet_addr("192.168.56.1"); //htonl(INADDR_ANY); //不能通信一定是这里出问题。如果没绑定成功它会自动退出
htonl(INADDR_ANY); //因此这边先要能绑定具体ip.客户端就直接填写这个发送的ip地址
if(bind(server,(SOCKADDR *)&addr,sizeof(SOCKADDR))!=0)  
{  
printf("Bind fail!\n");  
return -1;  

  
len = sizeof(addr);  //不能像客户端一样直接“sizeof(addr)”,这里是&指针
printf("start listen...\n");  
while(1)
{

  recvfrom(server, buf, BUFLEN, 0,(struct sockaddr*)&addr, &len); 
printf("recvfrom client:%s\n",buf);
memset(buf,0,sizeof(buf));
}  
     
closesocket(server);
WSACleanup();                     //关闭  
}

int main(void)  
{  
ServerUdp();
return 0;  
}  



0 0
原创粉丝点击