4.1
Socket API UNIX. - . , . C/C++, (Perl, #, Java .).
䳿 (IPC). 䳿 ', , . , , .
( ) . IP-.
, , : , . ', , TCP. ' , , , UDP. , TCP \ IP-.
2 :
- ;
- , .
4.1.1
(TCP).
:
1) ;
2) ᒺ Socket;
3) ᒺ /;
4) ;
5) 璺;
6) / ;
7) , .
볺:
1) ;
2) ᒺ Socket;
3) 璺 ;
4) / ;
5) , .
4.1.2
. ϳ
Winsock 2.x #include <winsock2.h> . WSAStartup (WORD wVersionRequested, LPWSADATA lpWSAData).
- wVersionRequested WORD, ( , );
- lpWSAData WSADATA, .
:
WORD sockVersion;
WSADATA wsaData;
sockVersion = MAKEWORD(2,2);
|
|
WSAStartup(sockVersion, &wsaData);
UNIX :
#include <sys/types.h>
#include <sys/socket.h>
. ᒺ Socket
ᒺ socket. SOCKET s (int af, int type, int protocol).
- f - ( AF_INET, Internet .);
- type . : SOCK_STREAM 璺, TCP SOCK_DFRAM 璺, UDP;
- protocol .
, INVALID_SOCKET.
:
SOCKET s = socket (AF_INET, SOCK_STREAM, 0);
// 0 , TCP.
ǒ
볺 / . /, . int bind (SOCKET s, const struct sockaddr FAR* name, int namelen).
s /;
name - sockaddr, /;
namelen sockaddr.
, 0.
sockaddr :
struct sockaddr { unsigned short sa_family; // , AF_xxx char sa_data[14];// 14 // }; sockaddr , sockaddr_in: struct sockaddr_in { short int sin_family; // unsigned short int sin_port; // struct in_addr sin_addr; // IP- unsigned char sin_zero[8]; // "" // // sockaddr};:
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(8888);
sin.sin_addr.s_addr = INADDR_ANY;
result = bind(s, (LPSOCKADDR)&sin, sizeof(sin));
, /, , 볺 . int listen (SOCKET s, int bac_klog).
s ;
bac_klog ( 璺, ).
:
result = listen(s, 5);
볺
볺 ( 璺). , SOCKET accept (SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen)..
s- ;
addr- sockaddr. 볺 /. 볺, NULL;
addrlen sockaddr;
ᒺ Socket, .
:
SOCKET client;
result = accept(s, NULL, NULL);
/
볺.
int send (SOCKET s, const char FAR * buf, int len,int flags).
|
|
s - 볺;
buf ;
len ;
flags , ( 0).
.
send , .
int recv (SOCKET s, char FAR* buf, int len, int flags).
s - 볺;
buf ;
len ;
flags , ( 0).
recv .
:
SOCKET client;
result = accept(s, NULL, NULL);
char recv_buf[40];
char send_buf[40] = "ANSWER";
result = recv(client, recv_buf, 40, 0);
send(client, send_buf, 40, 0);
,
ϳ 볺 璺. , , .
closesocket(client);
closesocket(s);
WSACleanup();
UNIX :
#include <unistd.h>int close(int fd);4.1.3 볺
. ϳ
Winsock 2.x #include <winsock2.h> . WSAStartup (WORD wVersionRequested, LPWSADATA lpWSAData).
- wVersionRequested WORD, ( , );
- lpWSAData WSADATA, .
:
WORD sockVersion;
WSADATA wsaData;
sockVersion = MAKEWORD(2,2);
WSAStartup(sockVersion, &wsaData);
UNIX :
#include <sys/types.h>
#include <sys/socket.h>
. ᒺ Socket
ᒺ socket. SOCKET s (int af, int type, int protocol).
- f - ( AF_INET, Internet .);
- type . : SOCK_STREAM 璺, TCP SOCK_DFRAM 璺, UDP;
- protocol ;
, INVALID_SOCKET.
:
SOCKET s = socket (AF_INET, SOCK_STREAM, 0);
// 0 , TCP.
ǒ
볺 璺 / , int connect (SOCKET s, const struct sockaddr FAR* name, int namelen).
s ;
name sockaddr, , 璺;
namelen sockaddr.
:
hostEntry = gethostbyname("127.0.0.1");
SOCKADDR_IN serverInfo;
serverInfo.sin_family = AF_INET;
serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
serverInfo.sin_port = htons(8888);
result=connect(s,(LPSOCKADDR)&serverInfo, sizeof(serverInfo));
/
볺.
int send (SOCKET s, const char FAR * buf, int len,int flags).
s - 볺;
buf ;
len ;
flags .
.
send , .
|
|
int recv (SOCKET s, char FAR* buf, int len, int flags).
s - 볺;
buf ;
len ;
flags .
recv .
:
SOCKET client;
result = accept(s, NULL, NULL);
char recv_buf[40];
char send_buf[40] = "ANSWER";
result = recv(client, recv_buf, 40, 0);
send(client, send_buf, 40, 0);
,
ϳ 볺 璺. , , .
closesocket(client);
closesocket(s);
WSACleanup();
UNIX :
#include <unistd.h>int close(int fd);4.1.4 WinSock
:
#include "stdafx.h"
#include <winsock2.h>
#pragma comment(lib, "wsock32.lib")
#define SERVER_SOCKET_ERROR 1
#define SOCKET_OK 0
int _tmain(int argc, _TCHAR* argv[])
{
int result;
WORD sockVersion;
WSADATA wsaData;
sockVersion = MAKEWORD(2,2);
WSAStartup(sockVersion, &wsaData);
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(8888);
sin.sin_addr.s_addr = INADDR_ANY;
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
if(s == INVALID_SOCKET)
{
printf ("%s", "ERROR (don't create serrver)\n");
WSACleanup();
return SERVER_SOCKET_ERROR;
}
else
{
printf ("%s", " >>> Create socket \n");
}
result = bind(s, (LPSOCKADDR)&sin, sizeof(sin));
if(result == SOCKET_ERROR)
{
printf ("%s", "ERROR (don't associates a
local address with a socket)");
WSACleanup();
return SERVER_SOCKET_ERROR;
}
else
{
printf ("%s", " >>> Associates a local
addres with a socket\n");
}
result = listen(s, 5);
if(result == SOCKET_ERROR)
{
printf ("%s", " ERROR (don't listen a socket)\n");
WSACleanup();
return SERVER_SOCKET_ERROR;
}
else
{
printf ("%s", " >>> get socket to listen \n");
}
while (1)
{
SOCKET client;
client = accept(s, NULL, NULL);
if(client == INVALID_SOCKET)
{
printf ("%s", " >>> ERROR (don't
accept a new socket)\n");
WSACleanup();
return SERVER_SOCKET_ERROR;
}
else
{
printf ("%s", " >>> new socket
client ACCEPT (client found)\n");
}
char recv_buf[40];
char send_buf[40] = "ANSWERRRRRRR";
result = recv(client, recv_buf, 40, 0);
recv_buf[result]=0;
send(client, send_buf, 40, 0);
printf ("%s", recv_buf);
printf ("%s", "\n");
if(result == SOCKET_ERROR)
{
int val = WSAGetLastError();
if(val == WSAENOTCONN)
{
printf ("%s", " ERROR (socket not
connected)?? \n");
}
else if(val == WSAESHUTDOWN)
{
printf ("%s", " ERROR (socket has
been shut down!)?? \n");
}
printf ("%s", " ERROR (FAILD RECV) \n");
return SERVER_SOCKET_ERROR;
}
closesocket(client);
printf ("%s", " >>> Close client socket \n");
} // END WHILE
closesocket(s);
printf ("%s", " >>> Close main socket \n");
WSACleanup();
|
|
return SOCKET_OK;
}
볺:
#include "stdafx.h"
#include <winsock.h>
#pragma comment(lib, "wsock32.lib")
#define CS_ERROR 1
#define CS_OK 0
int _tmain(int argc, _TCHAR* argv[])
{
WORD version;
WSADATA wsaData;
int result;
version = MAKEWORD(2,2);
WSAStartup(version,(LPWSADATA)&wsaData);
LPHOSTENT hostEntry;
hostEntry = gethostbyname("127.0.0.1");
if(!hostEntry)
{
printf ("%s", " >>> ERROR (hostEntry NULL)\n");
WSACleanup();
return CS_ERROR;
}
SOCKET theSocket = socket(AF_INET, SOCK_STREAM, 0);
if(theSocket == SOCKET_ERROR)
{
printf ("%s", " ERROR (don't create socket)\n");
return CS_ERROR;
}
else
{
printf ("%s", " >>> Create socket \n");
}
sockaddr_in serverInfo;
serverInfo.sin_family = AF_INET;
serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
serverInfo.sin_port = htons(8888);
result=connect(theSocket,(LPSOCKADDR)&serverInfo,
sizeof(serverInfo));
if(result==SOCKET_ERROR)
{
printf ("%s", " ERROR (don't connect to Server)\n");
return CS_ERROR;
}
else
{
printf ("%s", " >>> Connect to Server\n");
}
char send_buf[40] = "";
char recv_buf[40] = "";
scanf ("%s", send_buf);
result = send(theSocket, send_buf, strlen(send_buf), 0);
if(result == SOCKET_ERROR)
{
printf ("%s", " ERROR (Failed send ())\n");
return CS_ERROR;
}
recv(theSocket, recv_buf, 40, 0);
printf ("%s", recv_buf);
printf ("%s", "\n");
closesocket(theSocket);
printf ("%s", " >>> Close socket\n");
WSACleanup();
return CS_OK;
}
4.1.5 Unix
-볺:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
char message[] = "Hello there!\n";
char buf[sizeof(message)];
int main()
{
int sock;
struct sockaddr_in addr;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
perror("socket");
exit(1);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(3425);
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("connect");
exit(2);
}
send(sock, message, sizeof(message), 0);
recv(sock, buf, sizeof(message), 0);
printf(buf);
close(sock);
return 0;
}
-:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
int sock, listener;
struct sockaddr_in addr;
char buf[1024];
int bytes_read;
listener = socket(AF_INET, SOCK_STREAM, 0);
if(listener < 0)
{
perror("socket");
exit(1);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(3425);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("bind");
exit(2);
}
listen(listener, 1);
while(1)
{
sock = accept(listener, NULL, NULL);
if(sock < 0)
{
perror("accept");
exit(3);
}
while(1)
{
bytes_read = recv(sock, buf, 1024, 0);
if(bytes_read <= 0) break;
send(sock, buf, bytes_read, 0);
}
close(sock);
}
return 0;
}
4.2
볺.
: 볺 . , (), 볺 , ;
4.3
1. ? ?
2. ? ?
3. /?
4. , ?
5. ? ?
6. /볺? ?