windows 下实现同步socket编程,和linux下有许多相同的地方,基本的socket流程完全相同,所有的socket
相关的函数都在 Winsock.h 中声明;还有windows下socket编程要链接一个ws2_32.lib的库文件。
加入#pragma comment (lib,"ws2_32.lib") ,且在程序中将库要初始化;
TCP server 编程步骤;
服务器端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:绑定套接字到一个IP地址和一个端口上(bind());
3:将套接字设置为监听模式等待连接请求(listen());
4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
5:用返回的套接字和客户端进行通信(send()/recv());
6:返回,等待另一连接请求;
7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
server端程序如下:
#include <iostream>
//#include <windows.h>
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib ")
using namespace std;
void main()
{
WORD wVersionRequested;
WSAData wsaData;
int err;
cout<<"this is the server"<<endl;
//下边代码就是初始化库用的,先匹配库版本,启动库,若没匹配成功,再停止库
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
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[50];
char Buffer[50];
sprintf(Buffer,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));
send(sockConn,Buffer,strlen(Buffer)+1,0);
recv(sockConn,Buffer,50,0);
printf("%s\n",Buffer);
int i, ret;
while(1)
{
ret = recv(sockConn,Buffer,50,0);//if the connection been closed unexpectedly,a value of SOCKET_ERROR will
be returned
if(ret == SOCKET_ERROR )
{
cout<<"this connection has been closed"<<endl;
break;
}
printf("%s\n",Buffer);
for(i = 0; i< strlen(Buffer); i++)
{
Buffer[i] = Buffer[i] + 'A' - 'a';
}
send(sockConn,Buffer,strlen(Buffer)+1,0);
//printf("ddddddddddddddddddddd\n");
//Sleep(1000);
}
closesocket(sockConn);
}
getchar();
}
2222
tcp客户端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:向服务器发出连接请求(connect());
3:和服务器端进行通信(send()/recv());
4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
TCP client端程序:
#include <iostream>
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib ")
using namespace std;
void main()
{
WORD wVersionRequested;
WSAData wsaData;
int err;
cout<<"this is the client"<<endl;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData ); //initiates use of WS2_32.DLL
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );//terminates use of the WS2_32.DLL
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.123");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
send(sockClient,"hello eric",strlen("hello eric")+1,0);
char Buf[50];
recv(sockClient,Buf,50,0);
printf("%s\n",Buf);
while(1)
{
cin>>Buf;
if(Buf[0] == '.')
{
cout<<"the client will be closed"<<endl;
break;
}
send(sockClient,Buf,strlen(Buf)+1,0);
if(recv(sockClient,Buf,50,0))
printf(">>%s\n",Buf);
else
break;
}
closesocket(sockClient);
WSACleanup(); //terminates use of the WS2_32.DLL
getchar();
}
UDP server端程序
#include <stdio.h>
#include <iostream>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib ")
using namespace std;
class UDP_server
{
public:
UDP_server();
~UDP_server();
int UDP_server_init();
void UDP_receive(char *buf);
private:
SOCKET sockSrv;
SOCKADDR_IN addrSrv;
SOCKADDR_IN addrClient;
int err;
int len;
WORD wVersionRequested;
WSADATA wsaData;
};
UDP_server::UDP_server()
{
cout<<"the UDP server is created"<<endl;
}
UDP_server::~UDP_server()
{
cout<<"the UDP server is deleted"<<endl;
}
void UDP_server::UDP_receive(char *buf)
{
recvfrom(sockSrv,buf,100,0,(SOCKADDR*)&addrClient,&len);
printf("receive successfully\n");
}
int UDP_server::UDP_server_init()
{
cout<<"this is the UDP server"<<endl;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );//initiate the ws2_32.dll and match the version
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 || //if the version is not matched ,then quit and terminate the ws3_32.dll
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
sockSrv=socket(AF_INET,SOCK_DGRAM,0);
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
len=sizeof(SOCKADDR);
}
void main()
{
UDP_server sock;
char buf[100] = {0};
sock.UDP_server_init();
while(1)
{
sock.UDP_receive(buf);
printf("%s\n",buf);
}
getchar();
}
UDP client端程序:
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <WinSock.h>
#pragma comment(lib, "ws2_32.lib ")
using namespace std;
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
cout<<"this is the UDP client "<<endl;
wVersionRequested = MAKEWORD( 1, 1 );
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_DGRAM,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);
while(1)
{
sendto(sockClient,"Hello",strlen("Hello")+1,0,
(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
cout<<"send one massage successfully"<<endl;
Sleep(1000);
}
closesocket(sockClient);
WSACleanup();
getchar();
}