⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 helloclient.c

📁 回送程序 客户端向服务器端发送数据
💻 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 + -