?? helloclient.c
字號:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h> //定義錯誤碼
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<signal.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<netinet/ip.h>
#include<netinet/ip_icmp.h>
#include<netdb.h>
#include<setjmp.h>
int main(int argc,char*argv[])
{
int sockfd,new_fd ; //sockfd套接字描述符,由創建套接字函數socket()返回;new_fd通信套接字描述符
struct sockaddr_in server_addr ; //struct sockaddr_in為描述因特網地址結構(即TCP/IP地址結構)的數據結構
struct hostent *host ;
/** hostent類型的結構用于存放主機的信息,其定義如下:
struct hostnet {
char * h_name; //主機的正式名稱
char * *h_aliases; //別名列表
int h_addrtype; //主機地址類型:AF_XXX,在TCP/IP中為AF_INET
int h_length; //主機地址長度:4字節(32位)
char * *h_addr_list; //主機地址列表,當類型為AF_INET時為IP地址列表,一臺主機可能不止一個IP地址 }
#define h_addr h_addr_list[0] //將地址列表的第一個通過宏定義為結構的一個成員h_addr
*/
int portnumber,nbytes ;
char hello[]="Hello World\n" ;
if(argc!=3)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL) //通過gethostbyname()可以獲得地址與名稱信息
{
fprintf(stderr,"Gethostname error\n");
exit(1);
}
if((portnumber=atoi(argv[2]))<0) //atoi()函數用于把字符串轉換成長整型數
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
exit(1);
}
/* 客戶程序開始建立 sockfd描述符 */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) /創建tcp套接字使用函數socket()
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
/* 客戶程序填充服務端的資料 */
bzero(&server_addr,sizeof(server_addr)); //將地址結構置空
server_addr.sin_family=AF_INET ;//設置地址結構為tcp/ip地址族
server_addr.sin_port=htons(portnumber);//設置端口為網絡字節順序的服務器端口
server_addr.sin_addr=*((struct in_addr*)host->h_addr);//sin_addr 因特網地址(IP地址) //設置IP地址
//通過轉換函數將十進制點數表示法表示的IP地址轉換為網絡字節順序的IP地址,并且存儲在服務器地址結構中
/* 客戶程序發起連接請求 */
if(connect(sockfd,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr))==-1)
/** int connect(int sockfd,struct sockaddr *servaddr, int addrlen);
函數connect與服務器建立一個連接,成功返回0,失敗返回-1。
參數:
sockfd 套接字描述符,由客戶機程序調用函數socket()創建;
servaddr sockaddr地址結構,為遠程服務器的套接字地址信息,包括服務器的IP地址和端口號;
addrlen 地址結構的長度。
*/
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}
/*向服務器發消息*/
if(write(sockfd,hello,strlen(hello))==-1)// write()從套接字寫數據
{
fprintf(stderr,"Write Error:%s\n",strerror(errno));
exit(1);
}
/* 結束通訊 */
close(sockfd);
exit(0);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -