最近在做的一个项目要用到网络通信方面的内容,于是自学了下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")