需要链接Ws2_32.lib;
服务器端:
1. 加载套接字库WSAStartup();
2. 创建Socket,使用函数Socket();
3. 绑定到端口 bind() 将一个本地地址和一个套接字关联起来这里需要一个地址结构体
Sockaddr 在TCP/IP协议中用 sockaddr_in来代替sockaddr;
4. 将创建的socket设置为监听状态 使用listen();
5. 等待客户的连接请求,并接受客户的请求
accpt(), 该函数需要一个sockaddr结构体用来保存请求端的IP和端口信息,同时返回一个新的socket,用于和请求端进行通信
6. 发送,send()
7. 当通信的另一段发送信息过来时,可以通过recv()来接收该信息;
8. 当通信结束时,需要关闭用于通信的socket,closesocket释放该资源
9. 当所有请求处理完后,需要关闭用于监听的socket,并调用WSACleanup()
客户端:
1. 加载套接字库WSAStartup();
2. 创建Socket,使用函数Socket();
3. 对于客户端来说,不需要bind,可以直接去连接服务器端,即使用connect(),想服务器端发出请求
4. 调用recv()接收来自服务器端的响应;
5. 当然,也可以给服务器发送信息, 同样的send();
6. 当通信结束时,需要关闭用于通信的socket,closesocket释放该资源
下面是实例代码:
服务器端;
#include <winsock2.h>
#include <stdio.h>
int main(void)
{
//加载套接字库,可以直接从MSDN或其他文献粘贴即可
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 ); //套接字版本号
err = WSAStartup( wVersionRequested, &wsaData ); // 成功返回0
if ( err != 0 ) {
return -1;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1) {
WSACleanup( );
return -1;
}
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0); //创建socket,用于监听
// 套接字结构体,用于保存与监听套接字关联的IP和端口号
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET; //地址族
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转化为网络地址
addrSrv.sin_port = htons(6000); // 绑定端口6000,端口号不能小于1024
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //将填充好的sockaddr 和 /socket关联,即绑定
listen(sockSrv,5); //设置为监听状态,最大连接数为5
while(1)
{
SOCKET sockConn = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrConn;
//converts a u_long from host to TCP/IP network byte order
addrConn.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrConn.sin_family = AF_INET;
addrConn.sin_port = htons(6000);
int len = sizeof(SOCKADDR);
//accept函数,在监听端口上接受来自于客户端的请求,并将客户端的信息保存在 //addrConn中
sockConn = accept(sockSrv,(SOCKADDR*)&addrConn,&len);
char sendBuf[50];
char recvBuf[50];
sprintf(sendBuf,"welcome to world !\n");
send(sockConn,sendBuf,strlen(sendBuf)+1,0); //发送
recv(sockConn,recvBuf,strlen(recvBuf)+1,0); //接收
printf("%s",recvBuf);
closesocket(sockConn); //关闭通信socket
}
return 0;
}
客户端:
#include <winsock2.h>
#include <stdio.h>
int main(void)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return -1;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1)
{
WSACleanup( );
return -1;
}
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
//The Windows Sockets inet_addr function converts a string containing an (Ipv4) Internet Protocol //dotted address into a proper address for the IN_ADDR structure
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)); //向服务器端发送请求, //建立连接
char recvBuf[50] ;
recv(sockClient,recvBuf,sizeof(recvBuf)+1,0);
printf("%s\n",recvBuf);
send(sockClient,"zhai is zhai xiaoyan\n",strlen("zhai is zhai xiaoyan\n")+1,0);
closesocket(sockClient);
WSACleanup(); //关闭套接字库
return 0;
}