您的位置:首页 > 编程语言

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

2015-09-19 11:24 519 查看

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")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: