UDP/IP socket connect 非阻塞

// Server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<stdlib.h>

#include<string.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#pragma comment( lib, "ws2_32.lib" )
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
 SOCKET sockListener,nMsgLen;
 char szBuf[1024];
 struct sockaddr_in addrListener,addrClient;
 addrListener.sin_family=AF_INET;
 addrListener.sin_port=htons(8000);
 //addrListener.sin_addr.s_addr=INADDR_ANY; ///本机
 addrListener.sin_addr.s_addr=inet_addr("127.0.0.1");

 addrClient.sin_family=AF_INET;
 addrClient.sin_addr.s_addr=inet_addr("127.0.0.1");
 addrClient.sin_port=htons(8001);


 WSADATA wsaData;
 if (WSAStartup(MAKEWORD(2,2),&wsaData)) //调用Windows Sockets DLL
 {
  WSACleanup();
  return 0;
 }

 if((sockListener=socket(AF_INET,SOCK_DGRAM,0))==-1)
 {
  perror("error in getting a socket");
  exit(1);
 }
 int iMode = 1; //0:阻塞
 ioctlsocket(sockListener,FIONBIO, (u_long FAR*) &iMode);//非阻塞设置

 if(bind(sockListener,(struct sockaddr*)&addrListener,sizeof(addrListener))==-1)
 {
  perror("bind a listener for a socket");
  exit(2);
 }

 if(connect(sockListener,(struct sockaddr*)&addrClient,sizeof(addrClient))==-1)
 {
  perror("error in connecting");
  exit(1);
 }

 cout<<"callback server begin to listen"<<endl;
 while(true)
 {
// nMsgLen=recvfrom(sockListener,szBuf,1024,0,(struct sockaddr*)&addrClient,&addrLen);
// if(nMsgLen>0)
// {
// szBuf[nMsgLen]='\0';
// cout<<"send back:"<<szBuf<<endl;
// sendto(sockListener,szBuf,nMsgLen,0,(struct sockaddr*)&addrClient,addrLen);
// }
  szBuf[0] = '1';
  szBuf[1] = '2';
  szBuf[2] = '3';
  szBuf[3] = '4';
  szBuf[4] = '5';
  szBuf[5] = '\0';

  send(sockListener,szBuf,5,0);

  memset(szBuf,0,sizeof(szBuf)/sizeof(szBuf[0]));
  recv(sockListener,szBuf,5,0);
  cout<<"read:"<<szBuf<<endl;
 }
 closesocket(sockListener);
 WSACleanup();
 return 0;
}
============================================================================================================================================
// Client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>

#include <io.h>
#include<stdlib.h>
#include <stdio.h>
#include<string.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>

using namespace std;
#pragma comment( lib, "ws2_32.lib" )
int _tmain(int argc, _TCHAR* argv[])
{

 SOCKET sockClient;
 char szRecv[1024];
 struct sockaddr_in addrServer,addrClient;
 socklen_t addrLen;
 fd_set setHold,setTest;

 addrLen=sizeof(struct sockaddr_in);
 addrServer.sin_family=AF_INET;
 addrServer.sin_addr.s_addr=inet_addr("127.0.0.1");
 addrServer.sin_port=htons(8000);

 addrLen=sizeof(struct sockaddr_in);
 addrClient.sin_family=AF_INET;
 addrClient.sin_addr.s_addr=inet_addr("127.0.0.1");
 addrClient.sin_port=htons(8001);

 WSADATA wsaData;
 int iErrorCode;
 if (WSAStartup(MAKEWORD(2,2),&wsaData)) //调用Windows Sockets DLL
 {
  WSACleanup();
  return 0;
 }

 if((sockClient=socket(AF_INET,SOCK_DGRAM,0))==-1)
 {
  perror("error in getting a socket");
  exit(1);
 }


 int iMode = 1; //0:阻塞
 ioctlsocket(sockClient,FIONBIO, (u_long FAR*) &iMode);//非阻塞设置

 if(bind(sockClient,(struct sockaddr*)&addrClient,sizeof(addrClient))==-1)
 {
  perror("error in binding");
  exit(2);
 }

 if(connect(sockClient,(struct sockaddr*)&addrServer,sizeof(addrServer))==-1)
 {
  perror("error in connecting");
  exit(1);
 }


 FD_ZERO(&setHold);
 FD_SET(sockClient,&setHold);
 cout<<"you can type in sentences any time"<<endl;
 memset(szRecv,0,sizeof(szRecv)/sizeof(szRecv[0]));
 while(true)
 {
  setTest=setHold;
  //nReady=select(sockClient+1,&setTest,NULL,NULL,NULL);

// nMsgLen=read(sockClient,szMsg,1024);
// write(sockClient,szMsg,nMsgLen);
 
  if(FD_ISSET(sockClient,&setTest))
  {

   szRecv[0] = 'A';
   szRecv[1] = 'B';
   szRecv[2] = 'C';
   szRecv[3] = 'D';
   szRecv[4] = 'E';
   szRecv[5] = '\0';
   
   send(sockClient,szRecv,5,0);
   memset(szRecv,0,sizeof(szRecv)/sizeof(szRecv[0]));
   recv(sockClient,szRecv,5,0);
// nMsgLen=read(sockClient,szRecv,1);
// szRecv[nMsgLen]='\0';
// DWORD dw;
// ReadFile((HANDLE)sockClient,szRecv,10,&dw,NULL);
// szRecv[dw]='\0';
   cout<<"read:"<<szRecv<<endl;
  }

 }
 closesocket(sockClient);
 WSACleanup();
 return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值