TCPServer TCPClient三次握手模拟编程

套接字建立和关闭:socket

SOCKET socket(int af,int type,int protocal); 套接字类型: SOCK_STREAM 流套接字,TCP提供有链接的可靠传输 SOCK_DGRAM 数据包套接字,UDP提供无链接的不可靠传输 SOCK_RAW 原始套接字

绑定套接字到指定的IP地址和端口号spa

int bind( SOCKET s,//套接字句柄
const struct sockaddr * name,//关联的本地地址
int namelen//地址的长度
);

监听code

int listen( SOCKET s,//套接字
int backlog//最大链接数
)

链接blog

int accept( SOCKET s, struct sockaddr* addr,//取得对方的地址信息
int* addrlen//指向地址长度
); int connect( SOCKET s, const struct sockaddr FAR* name,//链接的地址信息
  int namelen  //结构长度
);

收发数据rem

int send( SOCKET s, const char FAR* buf,//要发送数据的缓冲区地址
int len,//缓冲区长度
int flags//指定调用方式,一般为0
); int recv( SOCKET s, char FAR* buf, int len, int );

 

TCPSERVER端代码:it

 1 // TCP.cpp : 定义控制台应用程序的入口点。  2 //  3 
 4 #include "stdafx.h"
 5 #include <winsock2.h>
 6 #include <stdio.h>
 7 
 8 #pragma comment(lib,"WS2_32")
 9 class CInitSock 10 { 11 public: 12     CInitSock(BYTE minorVer=2,BYTE majorVer=2) 13  { 14  WSADATA wsaData; 15         WORD sockVersion = MAKEWORD(minorVer,majorVer); 16         if(::WSAStartup(sockVersion,&wsaData)!=0) 17  { 18             exit(0); 19  } 20  } 21     ~CInitSock() 22  { 23  ::WSACleanup(); 24  } 25 }; 26 CInitSock initSock; 27 int _tmain(int argc, _TCHAR* argv[]) 28 { 29     SOCKET sListen = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 30     if(sListen == INVALID_SOCKET) 31  { 32         printf("Failed socket()\n"); 33         return 0; 34  } 35     //填充sockaddr_in结构
36  sockaddr_in sin; 37     sin.sin_family = AF_INET; 38     sin.sin_port = htons(4567); 39     sin.sin_addr.S_un.S_addr = INADDR_ANY; 40     //绑定这个套接字的一个本地地址
41     if(::bind(sListen,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR) 42  { 43         printf("Failed bind()\n"); 44         return 0; 45  } 46     //进入监听模式
47     if(::listen(sListen,2) == SOCKET_ERROR) 48  { 49         printf("Failed listen()\n"); 50         return 0; 51  } 52     //循环接受客户的链接请求
53  sockaddr_in remoteAddr; 54     int nAddrLen = sizeof(remoteAddr); 55  SOCKET sClient; 56     char szText[] = "TCP Server Demo!\r\n"; 57     while(TRUE) 58  { 59         //接受新链接
60         sClient=::accept(sListen,(SOCKADDR*)&remoteAddr,&nAddrLen); 61         if(sClient == INVALID_SOCKET) 62  { 63             printf("Failed accept()"); 64             continue; 65  } 66         printf("接受到一个链接:%s\r\n",inet_ntoa(remoteAddr.sin_addr)); 67         //向客户端发送数据
68         ::send(sClient,szText,strlen(szText),0); 69         //关闭同客户端的链接
70  ::closesocket(sClient); 71  } 72  ::closesocket(sListen); 73     return 0; 74 }

TCPClient 端代码:io

 1 // TCPClient.cpp : 定义控制台应用程序的入口点。  2 //  3 
 4 #include "stdafx.h"
 5 #include <winsock2.h>
 6 #include <stdio.h>
 7 #pragma comment(lib,"WS2_32")
 8 class CInitSock  9 { 10 public: 11     CInitSock(BYTE minorVer=2,BYTE majorVer=2) 12  { 13  WSADATA wsaData; 14         WORD sockVersion = MAKEWORD(minorVer,majorVer); 15         if(::WSAStartup(sockVersion,&wsaData)!=0) 16  { 17             exit(0); 18  } 19  } 20     ~CInitSock() 21  { 22  ::WSACleanup(); 23  } 24 }; 25 CInitSock initSock; 26 
27 int _tmain(int argc, _TCHAR* argv[]) 28 { 29     SOCKET s= ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 30     if(s==INVALID_SOCKET) 31  { 32         printf("Failed socket()\n"); 33         return 0; 34  } 35  sockaddr_in servAddr; 36     servAddr.sin_family=AF_INET; 37     servAddr.sin_port=htons(4567); 38     servAddr.sin_addr.S_un.S_addr=inet_addr("49.140.16.244"); 39     if(::connect(s,(sockaddr*)&servAddr,sizeof(servAddr))==-1) 40  { 41         printf("Failed connect()\n"); 42         return 0; 43  } 44     //接受数据
45     char buff[256]; 46     int nRecv=::recv(s,buff,256,0); 47     if(nRecv>0) 48  { 49         buff[nRecv] = '\0'; 50         printf("接受到数据:%s",buff); 51  } 52  ::closesocket(s); 53     return 0; 54 }

结果:class

相关文章
相关标签/搜索