在windows环境下利用winsock2进行网络编程
服务器端的建立
头文件
#include <iostream>
#include "afxdialogex.h"
#include <winsock2.h>
// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")
启动套接字
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
printf("WSAStartup failed with error: %d\n", err);
return 1;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return 1;
}
else
printf("The Winsock 2.2 dll was found okay\n");
创建监听套接字
SOCKET sockListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET == sockListen)
{
WSACleanup();
return 1;
}
绑定ip和端口
sockaddr_in addrServer;
addrServer.sin_family =AF_INET;
addrServer.sin_addr.S_un.S_addr = 0; //绑定本机任意网卡
addrServer.sin_port = htons(2020);//绑定端口
if( SOCKET_ERROR == bind(sockListen,(const sockaddr*)&addrServer,sizeof(addrServer)))
{
closesocket(sockListen);
WSACleanup();
return 1;
}
开启监听
//可同时监听十个客户
if(SOCKET_ERROR == listen(sockListen,10))
{
closesocket(sockListen);
WSACleanup();
return 1;
}
等待链接
while(1)
{
SOCKET sock = accept(sockListen,0,0);
//创建线程函数处理
_beginthreadex(0,0,&ThreadProc,(LPVOID)sock,0,0);
}
这里是线程处理函数
unsigned __stdcall ThreadProc( void *lpvoid )
{
SOCKET sock = (SOCKET)lpvoid;
char buf[1024] ={0};
//接收客户端发送内容
int num = recv(sock,buf,sizeof(buf),0);
if(num >0)
{
cout<<buf<<endl;
cin>>buf;
//回复客户端
send(sock,buf,sizeof(buf),0);
}
closesocket(sock);
return 0;
}
关闭套接字
closesocket(sockListen);
WSACleanup();
system("pause");
return 0;
}
客户端的建立
启动套接字
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
printf("WSAStartup failed with error: %d\n", err);
return 1;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return 1;
}
else
printf("The Winsock 2.2 dll was found okay\n");
创建客户端的套接字
//准备发送
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET == sockClient)
{
WSACleanup();
return 1;
}
开始链接服务器
sockaddr_in addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_addr.S_un.S_addr = inet_addr("服务器ip地址");
addrServer.sin_port = htons(2020);
if(SOCKET_ERROR == connect(sockClient,(const sockaddr*)&addrServer,sizeof(addrServer)))
{
closesocket(sockClient);
WSACleanup();
return 1;
}
给服务器发送数据
char buf[1024] = {0};
cin>>buf;
if(SOCKET_ERROR == send(sockClient,buf,sizeof(buf),0))
{
WSACleanup();
return 1;
}
接收服务器的回复
int num = recv(sockClient,buf,sizeof(buf),0);
if(num > 0)
{
cout<<buf;
}
关闭套接字
closesocket(sockClient);
WSACleanup();
system("pause");
return 0;
}