TCP客户端:
1、创建套接字
函数:(from msdn;下同)
SOCKET socket( int af, //指定地址族,它只能是AF_INET或PF_INET int type, //socket类型,两种类型:SOCK_STREAM(流式套接字); SOCK_DGRAM(数据报套接字).这里选择SOCK_STREAM int protocol //指定为0 );
eg:
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
2、向服务器发出连接请求
函数:
int connect( SOCKET s, //套接字 const struct sockaddr FAR *name, //设定连接服务器地址信息 int namelen //指定服务器端地址的长度 );
eg:
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(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
3、和服务器端进行通信(send / recv)
函数:
int send( SOCKET s, //已建立连接的套接字 const char FAR *buf, //缓冲区,保存将要传输的数据 int len, //缓冲区长度 int flags //设定的值将影响函数的行为,一般将其设置为0即可 );
int recv( SOCKET s, //已建立连接的套接字 char FAR *buf, //缓冲区,用来保存接收的数据 int len, //缓冲区的长度 int flags //设置为0 );
eg:
char sendbuf[] = "nihao";
send(sockClient,sendbuf,strlen(sendbuf)+1,0);
char recvbuf[100];
recv(sockClient,recvbuf,100,0);
printf("%s\n",recvbuf);
4、关闭套接字
函数:
int closesocket( SOCKET s //关闭套接字 );
eg:
closesocket(sockClient);
WSAClieanup();
整体程序:
#include <stdio.h>
#include <Winsock2.h>
void main()
{
///initialize socket
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
return;
}
///create socket
SOCKET sockClient;
sockClient = socket(AF_INET,SOCK_STREAM,0);
///connet socket
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(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
///recv data
char recvbuf[100];
recv(sockClient,recvbuf,100,0);
printf("%s\n",recvbuf);
///send data
char sendbuf[] = "1111";
send(sockClient,sendbuf,strlen(sendbuf)+1,0);
closesocket(sockClient);
WSACleanup();
}