客户端::::
#include <Winsock2.h>
#include <stdio.h>void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//请求一个1.1的版本的Winsocket库
err = WSAStartup( wVersionRequested, &wsaData );//1、加载套接字库,2、确定使用哪一个套接字的版本库
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );//终止对weinsocket库的使用
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//服务器端的IP地址,本地回路地址(一台),不管有没有网卡都可以,用于测试
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient,"This is zhangsan",strlen("This is zhangsan")+1,0);
closesocket(sockClient);
WSACleanup();
}
服务端:::::
#include <Winsock2.h>
#include <stdio.h>
void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//请求一个1.1的版本的Winsocket库
err = WSAStartup( wVersionRequested, &wsaData );//1、加载套接字库,2、确定使用哪一个套接字的版本库
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );//终止对weinsocket库的使用
return;
}
//到此加载完库
//创建套接字
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//服务器端的套接字
//绑定套接字到地址和端口上
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//
/*htonl
The htonl function converts a u_long from host to TCP/IP network byte order (which is big-endian).
u_long htonl(
u_long hostlong );*/
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);//只能用1024以上
bind(sockSrv,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR *)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"welcom %s to http://www.sunxin.org",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);
}
}
注释::进一步完善中...
intWSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
wVersionRequested
[in] Highest version of Windows Sockets support that the caller can use.The high-order byte specifies the minor version (revision) number; thelow-order byte specifies the major version number.
lpWSAData
[out] Pointer to the WSADATAdata structure that is to receive details of the Windows Socketsimplementation.
typedef structWSAData {
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
} WSADATA,*LPWSADATA;
Members
wVersion
Version of the Windows Socketsspecification that the Ws2_32.dll expects the caller to use.
wHighVersion
Highest version of the Windows Socketsspecification that this .dll can support (also encoded as above). Normally thisis the same as wVersion.
szDescription
Null-terminated ASCII string into which theWs2_32.dll copies a description of the Windows Sockets implementation. The text(up to 256 characters in length) can contain any characters except control andformatting characters: the most likely use that an application can put this tois to display it (possibly truncated) in a status message.
szSystemStatus
Null-terminated ASCII string into which theWSs2_32.dll copies relevant status or configuration information. The Ws2_32.dllshould use this parameter only if the information might be useful to the useror support staff: it should not be considered as an extension of the szDescriptionparameter.
iMaxSockets
Retained for backward compatibility, butshould be ignored for Windows Sockets version 2 and later, as no single valuecan be appropriate for all underlying service providers.
iMaxUdpDg
Ignored for Windows Sockets version 2 andonward. iMaxUdpDg is retained for compatibility with Windows Socketsspecification 1.1, but should not be used when developing new applications. Forthe actual maximum message size specific to a particular Windows Socketsservice provider and socket type, applications should use getsockoptto retrieve the value of option SO_MAX_MSG_SIZE after a socket has beencreated.
lpVendorInfo
Ignored for Windows Sockets version 2 andonward. It is retained for compatibility with Windows Sockets specification1.1. Applications needing to access vendor-specific configuration informationshould use getsockopt to retrieve the value of option PVD_CONFIG.The definition of this value (if utilized) is beyond the scope of thisspecification.
SOCKET socket(
int af,
int type,
int protocol
);
af
[in] Address family specification. 指定地址族,对于TCP/IP协议的套接字,只能是AF_INET(PF_INET)
type
[in] Type specification for the new socket.指定Stocket类型,对于1.1版本的Stocket,只支持两种类型,SOCK_STREAM指定产生流式套接字,SOCK_DGRAM产生数据报套接字
protocol
[in] Protocol to be used with the socket that is specific to theindicated address family.
与特定的地址家族相关的协议0 根据地址格式和套接字类别自动选择一个合适的协议
若调用成功,返回一个新的SOCKET数据类型的套接字描述符。若失败则返回INVALID_SOCKET,错误信息可以通过WSNGetLastError函数返回。
int bind(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);
Parameters
s
[in] Descriptor identifying an unbound socket. 指定要绑定的套接字
name
[in] Address to assign to the socket from the SOCKADDRstructure. 指定该套接字的本地地址信息,是指向sockaddr结构的指针变量,由于改地址结构是为所有地址家族准备的,这个结构可能随所用的网络协议不同而不同,所以要用第三个参数指定改地址结构的长度。
namelen
[in] Length of the value in the name parameter.
struct sockaddr {
u_short sa_family;指定改地址家族,必须设为AF_INET
char sa_data[14];表示要求一块内存分片区
};
可以用下面结构替代
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};