windows 下socket 编程

来源:互联网 发布:公路计算软件 编辑:程序博客网 时间:2024/05/19 02:19

111111windows 下用Microsoft Visual Studio 2005 编写socket程序
 
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();
}

 


 

0 0
原创粉丝点击