TCPServer TCPClient 3回握手シミュレーションプログラミング

10458 ワード

ソケットの作成とクローズ:
SOCKET socket(int af,int type,int protocal);

     :

SOCK_STREAM     ,TCP          

SOCK_DGRAM       ,UDP           

SOCK_RAW      

指定したIPアドレスとポート番号へのソケットのバインド
int bind(
SOCKET s,//     
const struct sockaddr * name,//       
int namelen//     
);

かんし
int listen(
SOCKET s,//   
int backlog//     
)

せつぞく
int accept(
SOCKET s,
struct sockaddr* addr,//         
int* addrlen//      
);

int connect(
  SOCKET s,
  const struct sockaddr FAR* name,//       
  int namelen  //    
);

データの送受信
int send(
SOCKET s,
const char FAR* buf,//           
int len,//     
int flags//      ,   0
);
int recv(
SOCKET s,
char FAR* buf,
int len,
int
);

 
TCPSERVERエンドコード:
 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()
"); 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()
"); 44 return 0; 45 } 46 // 47 if(::listen(sListen,2) == SOCKET_ERROR) 48 { 49 printf("Failed listen()
"); 50 return 0; 51 } 52 // 53 sockaddr_in remoteAddr; 54 int nAddrLen = sizeof(remoteAddr); 55 SOCKET sClient; 56 char szText[] = "TCP Server Demo!\r
"; 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
",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エンドコード:
 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()
"); 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()
"); 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 }

結果: