TCPServer TCPClient 3回握手シミュレーションプログラミング
10458 ワード
ソケットの作成とクローズ:
指定したIPアドレスとポート番号へのソケットのバインド
かんし
せつぞく
データの送受信
TCPSERVERエンドコード:
TCPClientエンドコード:
結果:
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 }
結果: