.


:




:

































 

 

 

 


: . 볺.




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. /볺? ?

 

 





:


: 2016-12-05; !; : 635 |


:

:

, .
==> ...

1801 - | 1556 -


© 2015-2024 lektsii.org - -

: 0.176 .