win32 socket编程 示例(功能简单,完善)

来源:互联网 发布:mac mini 2014 换内存 编辑:程序博客网 时间:2024/05/02 01:47

win32 socket编程 示例(功能简单,完善)



最近在做的一个项目要用到网络通信方面的内容,于是自学了下win32socket,原来自己学过计算机网络,只了解网络各层的原理,但没有真正的编程来实现这些原理,哎,不过现在还来得及,下面是自己的一个示例,虽然简单,但了解了它,就知道了最基本的socket编程的方法!

/*

功能描述:与服务器连接后,可以不断的与服务器端通信(发送信息)

当服务器关闭,程序将提示退出!

*/

client.cpp

// Client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Winsock2.h"
#include "stdio.h"
#include "stdlib.h"
void main()
{
//初始化socket编程环境
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
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( 4000 ) ;
//连接服务器

//等待接收服务器的响应
char recvBuf[100];
memset(recvBuf, 0, 100);
connect( sockClient , (SOCKADDR*)&addrSrv , sizeof(SOCKADDR)) ;
int r = 0;
do//不断与服务器连接,直到它关闭
{
   printf("receiving.....\n");
   r = recv( sockClient , recvBuf , 100 , 0 ) ;
   printf("receive end.....\n");
   printf( "data from server: %s\n" , recvBuf ) ;

   char sendBuf[100] ;
   printf("input the message to send[1-100]: ");
   gets(sendBuf);
   printf("sending.....\n");
   r = send( sockClient , sendBuf , strlen(sendBuf)+1 , 0 ) ;
   printf("send ended. waiting for server\n");
  
}while(r != SOCKET_ERROR);
printf("server connect error! app will exit\n");
system("PAUSE");
closesocket( sockClient ) ;
WSACleanup() ; 
}

/*
功能描述:不断的监听客户端的TCP连接信息,并反馈给客户端

直到客户端关闭

*/

// Socket Demo.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Winsock2.h"
#include "stdio.h"
#include "stdlib.h"
void main()
{
//初始化socket编程环境
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; 
}
//创建Tcp服务器socket
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(4000) ;

//将socket与地址绑定在一起
bind( sockSrv ,(SOCKADDR*)&addrSrv , sizeof(SOCKADDR) ) ;
//开始监听客户端请求,最大连接数为5
listen( sockSrv , 5 ) ;

//用于存放客户端地址
SOCKADDR_IN addrClient ;
int len = sizeof( SOCKADDR_IN ) ;
//不断接收客户端发送的请求
SOCKET sockConn;
//接收到的客户端请求socket
printf("accepting.....\n");
sockConn = accept( sockSrv , (SOCKADDR *)&addrClient , &len ) ;
printf("accept end.....\n");
//发送数据
char sendBuf[100] ;
memset(sendBuf, 0, 100);
int r = 0;
do {///不断得到客户端发来的请求
  
  
   sprintf( sendBuf , "Weclome %s to here:" , inet_ntoa(addrClient.sin_addr) ) ;
   printf("sending.....\n");
   r = send( sockConn , sendBuf , strlen(sendBuf)+1 , 0 ) ;
   printf("send end.....\n");
   //接收数据
   char recvBuf[100] ;
   printf("receiving.....\n");
   r = recv( sockConn , recvBuf , 100 , 0 ) ;
   printf("receive end.....\n");
   printf("data from client: %s\n" , recvBuf ) ;
}while ( r != SOCKET_ERROR );

printf("client connect error! app will exit\n");
system("PAUSE");
//关闭socket
closesocket( sockConn ) ;
//清理socket编程环境
WSACleanup() ;
}

配置:必须加入WS2_32.lib!

win32 socket编程要用到WS2_32.lib,请在配置里面的链接器->输入中的附加依赖项中加入它

或者用#pragma comment(lib, "Ws2_32.lib")

0 0
原创粉丝点击