?? vcclient.c
字號:
/* vcclient.c client */
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> /* sockaddr_in 結構體 */
/* 下面的這個include可以使程序查詢主機名字列表,找出所有與其相關的hostname */
#include <netdb.h> /* /etc/hosts 列表 */
main (argc, argv)
int argc;
char *argv[];
/* 需要的命令行參數說明:Expected command line parameters:
argv[0] - 可執行的名稱
argv[1] - 目的連接主機名
argv[2] - 客戶端將要用到的端口號,這個值將由服務器端給定
盡管不是必須的,調試連接代碼也是非常有用的。例如,如果主機名(argv[1])
被設置為"localhost",客戶端程序和服務器端程序都將在同一個系統中運
行,但是網絡的連接代碼同樣可以練習。 */
{
int sock, /* 套接字描述符 */
val, /* 臨時變量 */
cnt; /* I/O緩沖區個數 */
struct sockaddr_in myname; /* Internet套接字名稱(addr) */
struct sockaddr_in *nptr; /* 獲取端口號的指針 */
char buf[80]; /* I/O 緩沖區 */
/* 下面查找 /etc/hosts 文件 */
struct hostent *hp, *gethostbyaddr();
/* 檢查用戶輸入的所有命令行參數。將argv[2]轉換成整型,并把它拷貝
到myname結構體的sin_port參數中作為端口號。調用htons函數把
這個值用網絡字節順序存放 */
if ( argc < 3 ) {
printf("network client failure: required parameters");
printf(" missing from the command line\n");
printf("network client: usage");
printf("[executable-name] [host name] [port number]\n");
exit(1);
}
/* 建立一個客戶套接字請求服務 */
if (( sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
printf("network client socket failure %d\n", errno);
perror("network client");
exit(2);
}
/* 把用戶提供的端口號轉換為整型。 */
myname.sin_port = htons( atoi(argv[2]) ); /* 服務器端口號 */
myname.sin_family = AF_INET; /* 定義為Internet范圍 */
/* 這里打印出域名和轉換過的端口號 */
printf("network client %s will try to connect to host %s\n",
argv[0], argv[1]);
printf("network client %s will use port number %d\n",
argv[0], ntohs ( myname.sin_port ) );
/* 獲取主機信息. */
hp = gethostbyname ( argv[1] );
/* 在一切運行正常的情況下請不要刪除這個值,或許它在以后能用到。
也可以把它放在注釋中。 */
if ( hp == NULL ) {
printf("network client gethostbyname failure %d\n",
errno);
perror("network client");
close ( sock );
exit(3);
}
else {
printf("\nServer information obtained via");
printf(" gethostbyname:\n");
printf("\tThe official host name is %s\n", hp -> h_name);
printf("\tThe address type is %d\n", hp -> h_addrtype);
printf("\tThe length of the address is %d bytes\n",
hp -> h_length);
printf("\tThe first host address is %lx\n",
ntohl ( * (int * ) hp -> h_addr_list[0] ) );
printf("\tAlias names for the host are:\n");
while ( *hp -> h_aliases )
printf( "\t\t%s\n", *hp -> h_aliases++ );
}
/* 如果是在UNIX system V中請用memcpy代替bcopy函數 */
bcopy ( hp -> h_addr_list[0], &myname.sin_addr.s_addr,
hp -> h_length );
/* memcpy ( &myname.sin_addr.s_addr, hp -> h_addr_list[0],
hp -> h_length ); */
/* 在連接到本地或者遠程服務器之前需要核實一下myname結構體中變量的值,
將它們打印出來: */
printf("\nInformation provided in client's");
printf(" connect request\n");
printf("\tRemote host address is %lx\n",
ntohl ( myname.sin_addr.s_addr ) );
printf("\tPort number supplied is %d\n",
ntohs ( myname.sin_port ) );
printf("\tInternet family ID is %d\n", myname.sin_family);
printf("\tsin_zero character string is: %s\n",
myname.sin_zero);
/* 建立與本地或者遠程服務器的套接字連接 */
if ( ( connect ( sock, &myname, sizeof(myname) ) ) < 0 ) {
printf("network client %s connect failure %d\n",
argv[0], errno);
perror("network client");
close (sock);
exit(4);
}
/* 與客戶端交換數據。首先清空緩沖區 */
memset (buf,0,sizeof(buf)); /* 清空緩沖區 */
/* bzero( buf, sizeof(buf)); /* 清空緩沖區, BSD 調用. */
strcpy ( buf, "Message from client to server" );
write ( sock, buf, sizeof(buf) );
/* 讀取服務器發送的信息 */
if ( ( cnt = read (sock, buf, sizeof(buf) ) ) < 0 ) {
printf("network client socket read failure &d\n", errno);
perror("network client");
close(sock);
exit(5);
}
else
printf("network client received the message %s\n", buf);
/* 現在發送一個0字節的測試信息 */
/* 首先清空緩沖區 */
memset (buf,0,sizeof(buf)); /* 清空緩沖區 */
/* bzero( buf, sizeof(buf)); /* 清空緩沖區, BSD 調用. */
write ( sock, buf, 0 );
close (sock);
exit(0);
} /* end of main */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -