📄 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 + -