#include <Winsock2.h>
#include <stdio.h>
void main()
{
//加载socket库
WORD wVersionRequested;//16-bit unsigned integer.VC中的16进制的无符号整数。
WSAData wsaDATA;
int err;
/************************************************************************
struct WSAData {
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYSSTATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char *lpVendorInfo;
};
WSADATA结构被用来保存AfxSocketInit函数返回的Windows Sockets初始化信息。
http://baike.baidu.com/view/2297317.htm
*************************************************************************/
wVersionRequested = MAKEWORD(1,1);//这个宏创建一个无符号16位整形,通过连接两个给定的无符号参数。
err = WSAStartup(wVersionRequested,&wsaDATA);
if (err!=0)
{
return;
}
if (LOBYTE(wsaDATA.wVersion)!=1||HIBYTE(wsaDATA.wVersion!=1))
{
WSACleanup();
return;
}
//创建套接字
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
/************************************************************************
函数原型 int socket(int domain, int type, int protocol);
domain: 应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;
type: 要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW;
protocol:指定应用程序所使用的通信协议。此参数可以指定单个协议系列中的不同传输协议。在Internet通讯域中,
此参数一般取值为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(6000);
/***********************************************************************
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。
但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构sockaddr_in.
struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};
------------------------------------------------------------------------
struct sockaddr_in {
short sin_family; //Address family ,地址家族,一般都是“AF_xxx”的形式。
通常大多用的是都是AF_INET,代表TCP/IP协议族.
unsigned short sin_port; //Port number,存储端口号(使用网络字节顺序).
struct in_addr sin_addr; //Internet address ,存储IP地址,使用in_addr这个数据结构.
unsigned char sin_zero[8]; //Same size as struct sockaddr ,sin_zero是为了让sockaddr与sockaddr_in
两个数据结构保持大小相同而保留的空字节。
}
-------------------------------------------------------------------------
*************************************************************************/
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
/*
connect()用来将参数 sockfd 的socket连至参数serv_addr 指定的网络地址.
int connect(
SOCKET s, //Descriptor identifying an unconnected socket.
const struct sockaddr FAR* name,//Name of the socket to which the connection should be established.
int namelen //Length of the name.
);
*/
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
/*
int recv(SOCKET s,char FAR *buf, int len, int flags );
第一个参数指定接收端套接字描述符;
第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
第三个参数指明buf的长度;
第四个参数一般置0.
*/
printf("%s\n",recvBuf);
send(sockClient,"这是张三",strlen("这是张三")+1,0);
/*
int send( SOCKET s,const char FAR *buf,int len,int flags);
第一个参数指定发送端套接字描述符;
第二个参数指明一个存放应用程序要发送数据的缓冲区;
第三个参数指明实际要发送的数据的字节数;
第四个参数一般置0.
*/
closesocket(sockClient);
WSACleanup();
}
#include <Winsock2.h>
#include <stdio.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 sockSvr=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSvr;
addrSvr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSvr.sin_family=AF_INET;
addrSvr.sin_port=htons(6000);
bind(sockSvr,(SOCKADDR*)&addrSvr,sizeof(SOCKADDR));
/*
int bind(int socket, const struct sockaddr *address,socklen_t address_len);
bind函数用于将套接字绑定到一个已知的地址上.
socket:是一个套接字.
address:是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号.
address_len:确定address缓冲区的长度.
返回值:如果函数执行成功,返回值为0,否则为SOCKET_ERROR.
*/
listen(sockSvr,5);
/*************************************************************************************
int listen(int sockfd, int backlog);
功能:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,
从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的
套接字变为被动连接.
listen函数在一般在调用bind之后-调用accept之前调用.
sockfd : 一个已绑定未被连接的套接字描述符;
backlog: 连接请求队列(queue of pending connections).
的最大长度(一般由2到4).用SOMAXCONN则由系统确定.
**************************************************************************************/
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while (1)
{
SOCKET sockConn=accept(sockSvr,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"今天天气好晴朗!",inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(sockConn);
}
}