WINSOCK介绍
Winsock是一个基于Socket模型的API,在Windows系统中广泛使用。
它在Berkeley接口函数的基础上,还增加了基于消息驱动机制的Windows扩展函数。
Winsock1.1只支持TCP/IP网络,Winsock2.2增加了对更多协议的支持。
包含的头文件
Winsock2.h
导入库ws2_32.lib
#pragma comment(lib,”ws2_32.lib”);
可以打开工程属性页,配置属性->链接器->输入->附加依赖项中加入ws2_32.lib
以上两种方法任选其一
l
网络连接函数
socket 创建套接字
bind 绑定本机端口
listen 监听端口
accept 接受连接
connect 建立连接
recv, recvfrom 数据接收
send,sendto 数据发送
客户端代码实现
#include <winSock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
#define MYPORT 6666
#define MYADDR "192.168.1.23"
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(2,2);
if(WSAStartup(wVersionRequested,&wsaData) != 0)
{
return 1;
}
if(wsaData.wVersion != wVersionRequested)
{
WSACleanup();
return 1;
}
SOCKET socketfd;
SOCKET clientfd;
socketfd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(socketfd == INVALID_SOCKET)
{
cout<<"create error";
return -1;
}
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(MYPORT);
server_addr.sin_addr.s_addr = inet_addr(MYADDR);
int ret;
ret = connect(socketfd,(struct sockaddr *)&server_addr,sizeof(server_addr));
if(ret == -1)
{
cout<<"connect error";
return -1;
}
cout<<"connect sucessfully...\n";
int writecnt = 0;
char writebuff[20];
while(1)
{
cin>>writebuff;
writecnt = send(socketfd,writebuff,sizeof(writebuff),0);
if(writecnt == -1)
{
cerr<<"write error"<<endl;
}
if(strcmp(writebuff,"end") == 0)
{
break;
}
cout<<writebuff<<endl;
memset(writebuff,0,20);
}
system("pause");
closesocket(socketfd);
return 0;
}
服务器代码实现
#include <winSock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define MYPORT 6666
#define MYADDR "192.168.1.23"
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(2,2);
if(WSAStartup(wVersionRequested,&wsaData) != 0)
{
return 1;
}
if(wsaData.wVersion != wVersionRequested)
{
WSACleanup();
return 1;
}
SOCKET socketfd;
int len;
socketfd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(socketfd == INVALID_SOCKET)
{
cout<<"create error";
return -1;
}
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(MYPORT);
server_addr.sin_addr.s_addr = inet_addr(MYADDR);
int opt = 1;
int ret;
ret = setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof(opt));
if (ret == SOCKET_ERROR)
{
cout<<"error with code = "<<WSAGetLastError()<<endl;
exit(1);
}
cout<<"socket successfully"<<endl;
ret = bind(socketfd,(struct sockaddr *)&server_addr,sizeof(server_addr));
if(ret == -1)
{
cout<<"bind error"<<endl;
return -1;
}
cout<<"bind sucessfully...\n";
ret = listen(socketfd,10);
if(ret == -1)
{
cout<<"listen error"<<endl;
return -1;
}
cout<<"listen sucessfully...\n";
int clientfd = 0;
len = sizeof(server_addr);
clientfd = accept(socketfd,(struct sockaddr *)&client_addr,&len);
if(clientfd == INVALID_SOCKET)
{
cout<<"accept error"<<endl;
return -1;
}
cout<<"accept sucessully...\n";
cout<<inet_ntoa(client_addr.sin_addr)<<" "<<ntohs(client_addr.sin_port)<<endl;
int recvcnt = 0;
char recvbuff[20];
while(1)
{
recvcnt = recv(clientfd,recvbuff,sizeof(recvbuff),0);
if(recvcnt == SOCKET_ERROR)
{
cerr<<"read error"<<endl;
break;
}
if(recvcnt == 0)
{
cout<<"client close"<<endl;
break;
}
cout<<recvbuff<<endl;
if(strcmp(recvbuff,"end") == 0)
{
break;
}
memset(recvbuff,0,20);
}
closesocket(clientfd);
closesocket(socketfd);
return 0;
}
¡closesocket,shutdown 关闭套接字